使用列表推导对数据框列表中的数据框进行编号

Posted

技术标签:

【中文标题】使用列表推导对数据框列表中的数据框进行编号【英文标题】:Using list comprehension to number dataframes in a list of dataframes 【发布时间】:2018-02-15 20:41:14 【问题描述】:

我有一个包含 4 个数据帧的列表,称为 df。 我想为每个表示数据帧编号的数据帧 (df[i]['number']) 添加一个“数字”列。

我尝试使用列表推导:

df=[df['number']=(x+1) for x in range(0,4)]

导致

   File "<ipython-input-52-0b708f543fbb>", line 1
   df=[df['number']=(x+1) for x in range(0,4)]
                    ^
SyntaxError: invalid syntax

我也试过了:

df=[x['number']=(y+1) for x,y in enumerate(df)]

同样的结果,指向 '=' 符号。

我做错了什么?

【问题讨论】:

【参考方案1】:

使用enumerate,从 1 开始并分配给列表中的每个数据框。

for i, d in enumerate(df, 1):
    d['number'] = i

就地赋值比列表理解中的赋值便宜。


df[0]
   id  marks
0   1    100
1   2    200
2   3    300

df[1]
    name  score flag
0  'abc'    100    T
1  'zxc'    300    F


for i, d in enumerate(df, 1):
    d['number'] = i

df[0]
   id  marks  number
0   1    100       1
1   2    200       1
2   3    300       1

df[1]
    name  score flag  number
0  'abc'    100    T       2
1  'zxc'    300    F       2

性能

1000 loops, best of 3: 278 µs per loop # mine

1000 loops, best of 3: 567 µs per loop # John Galt

大号 (df * 10000)

1000 loops, best of 3: 607 µs per loop # mine

1000 loops, best of 3: 1.16 ms per loop # John Galt - assign
1 loop, best of 1: 1.42 ms per loop # John Galt - side effects

请注意,基于循环的分配也很节省空间。

【讨论】:

【参考方案2】:

使用

1)

In [454]: df = [x.assign(number=i) for i, x in enumerate(df, 1)]

In [455]: df[0]
Out[455]:
          0         1  number
0  0.068330  0.708835       1
1  0.877747  0.586654       1

In [456]: df[1]
Out[456]:
          0         1  number
0  0.430418  0.477923       2
1  0.049980  0.018981       2

好的部分,您可以将其分配给新变量,而无需更改旧列表,例如

dff = [x.assign(number=i) for i, x in enumerate(df, 1)]

2)

如果你想要就地和列表理解

In [474]: [x.insert(x.shape[1] ,'number', i) for i, x in enumerate(df, 1)]
Out[474]: [None, None, None, None]

In [475]: df[0]
Out[475]:
          0         1  number
0  0.207806  0.315701       1
1  0.464864  0.976156       1

【讨论】:

@jezrael 非常 节省空间...assign 创建副本 你去,就地和列表理解! 这当然不漂亮...使用列表组合产生副作用,但荣誉:p “漂亮”是个人品味。 assign 和 list compre 比带有缩进赋值的 for 循环更漂亮。 ;-) 列表推导不应该用于副作用。如果你要使用它们,你应该创建一个新的数据框。如果要变异,请使用 for 循环。

以上是关于使用列表推导对数据框列表中的数据框进行编号的主要内容,如果未能解决你的问题,请参考以下文章

根据另一个数据框/列表对数据框中的列进行子集化

Python - 在熊猫数据框中对列表中的行进行分组

使用索引值列表对 pandas 多索引数据框进行切片 [重复]

根据列表中的数据框创建数据框,并在R中的列中包含最大值

当返回的列表长度与数据框列数相同时,应用 + 列表推导会给出 ValueError

数据框列中的字符串列表行之间的成对距离