如何用Pandas的iloc获取索引列表?求更优Pandas实现方案
嘿,针对你想要给每行生成包含从起始行到当前行索引列表的需求,确实有更贴合Pandas特性的实现方式,完全不用手动写循环折腾~
先聊聊你找到的解决方案
你提到的@wen的方法非常巧妙,用Pandas的字符串累加操作就搞定了,我再给你拆解下逻辑,方便理解:
data['ind'] = data.index.astype(str) + ',' data['cumsum_indexes'] = data['ind'].cumsum().str[:-1].str.split(',')
- 第一步把索引转成字符串并加逗号,是为了后续累加后能轻松分割成独立的索引项;
cumsum()会逐行累加前面的索引字符串,比如第二行就会变成"0," + "1," = "0,1,";- 最后用
str[:-1]去掉末尾多余的逗号,再通过str.split(',')转成列表,就完美得到了每行对应的索引列表。
另一种更直观的原生方法
如果你觉得字符串操作有点绕,也可以用apply结合索引切片来实现,逻辑更直白:
data['cumsum_indexes'] = data.apply(lambda row: data.index[:row.name+1].tolist(), axis=1)
这里row.name就是当前行的索引值,直接取从开头到当前索引的切片,再转成列表就行,代码可读性拉满,不过要注意:在超大数据集上,apply的效率会略低于上面的字符串累加方法。
顺带提下你最初代码的小问题
你原来写的代码有几个语法细节需要修正:
- 要把
series_data = [] for count,x in enumerate(df):拆成两行,不然会触发语法错误; df['up_to_row'].iloc(count)应该改成df['up_to_row'].iloc[count](Pandas的iloc是用方括号取值的);- 最重要的是:手动循环在处理大数据集时,效率远不如Pandas的矢量操作,所以更推荐上面的两种原生方法。
内容的提问来源于stack exchange,提问作者Back2Basics
相关产品推荐
相关产品推荐

