我希望遍历此数据框,以增加列['B']
和列['C']
的列表大小。这个例子并不重要,但这些列表将在每次迭代期间输入到一个函数中。
例如:
df = pd.DataFrame({'A' : ['a','a','b','b'],
'B' : ['1','2','1','2'],
'C' : ['2','3','1','6']})
通过遍历此数据框,我希望获得如下内容:
(从列['B']
开始)
[1]
[1,2]
[1,2,1]
[1,2,1,2]
(然后是专栏['C']
)
[2]
[2,3]
[2,3,1]
[2,3,1,6]
这些列表将在每次迭代结束时放入一个函数中,但我遇到的问题是编写一个正确的for循环来编码列表生成。
我的问题的第二个方面并不重要......但如果我也可以迭代地输出列表中的['A']
值,那将会很好(例如,当迭代时列['C']
,列表[2,3]
与['A'] = 'b'
相关,而['C']
的列[2,3,1]
中的列表与['A'] = 'b'
相关。
非常感谢任何帮助。
答案 0 :(得分:4)
df['B'],df['C']=df[['B','C']].values[::None].T.cumsum(axis=1)
df.applymap(list)
Out[1118]:
A B C
0 [a] [1] [2]
1 [a] [1, 2] [2, 3]
2 [b] [1, 2, 1] [2, 3, 1]
3 [b] [1, 2, 1, 2] [2, 3, 1, 6]
更新了
df[['B','C']]=df[['B','C']].applymap(list)
df
Out[1121]:
A B C
0 a [1] [2]
1 a [1, 2] [2, 3]
2 b [1, 2, 1] [2, 3, 1]
3 b [1, 2, 1, 2] [2, 3, 1, 6]
答案 1 :(得分:2)
有点做作,但这可能是最简单的方法。请注意,列表中的添加非常昂贵。
df[['B', 'C']] = df[['B', 'C']].values.reshape(-1, 2, 1).tolist()
df[['B', 'C']].cumsum()
B C
0 [1] [2]
1 [1, 2] [2, 3]
2 [1, 2, 1] [2, 3, 1]
3 [1, 2, 1, 2] [2, 3, 1, 6]
技巧是增加数组的维度,因此每个元素都成为一个包含单个元素的列表。分配回来后,您可以拨打df.cumsum
,按行进行操作,并将这些列表累加在一起。
答案 2 :(得分:2)
另一种方法是使用“扩展窗口”功能:
>>> def expanding_window(obj):
n = len(obj) + 1
return [obj[:i] for i in range(1, n)]
>>> pd.DataFrame([expanding_window(df[k].tolist()) for k in df.columns], index=df.columns).T
A B C
0 [a] [1] [2]
1 [a, a] [1, 2] [2, 3]
2 [a, a, b] [1, 2, 1] [2, 3, 1]
3 [a, a, b, b] [1, 2, 1, 2] [2, 3, 1, 6]
答案 3 :(得分:1)
如果你想使用for循环,你可以这样做:
for col in ['B','C']:
print([df[col].tolist()[:i+1] for i,v in enumerate(df[col].tolist())])
[['1'], ['1', '2'], ['1', '2', '1'], ['1', '2', '1', '2']]
[['2'], ['2', '3'], ['2', '3', '1'], ['2', '3', '1', '6']]
对于你的第二个问题,这就是你要追求的吗?
for col in ['B','C']:
print([df[col].tolist()[:i+1]+[df.A.iloc[i]] for i,v in enumerate(df[col].tolist())])
[['1', 'a'], ['1', '2', 'a'], ['1', '2', '1', 'b'], ['1', '2', '1', '2', 'b']]
[['2', 'a'], ['2', '3', 'a'], ['2', '3', '1', 'b'], ['2', '3', '1', '6', 'b']]