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

2024-04-16 09:16:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望遍历这个数据帧来增加列['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'相关,而来自[2,3,1]的列['C']的列表与['A'] = 'b'相关。你知道吗

非常感谢您的帮助。你知道吗


Tags: 数据函数dataframe编码df列表for例子
3条回答

另一种方法是使用“扩展窗口”功能:

>>> 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]
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]

有点做作,但这可能是最简单的方法。请注意,在列表中添加是非常昂贵的。你知道吗

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,它按行操作并将列表累加在一起。你知道吗

相关问题 更多 >