系统地迭代DF的多个列和行,以跨多个列输出不同的列表大小

时间:2018-01-23 00:28:17

标签: python list pandas loops iteration

我希望遍历此数据框,以增加列['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'相关。

非常感谢任何帮助。

4 个答案:

答案 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']]