使用列表推导对数据框列表中的数据框进行编号
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 循环。以上是关于使用列表推导对数据框列表中的数据框进行编号的主要内容,如果未能解决你的问题,请参考以下文章
使用索引值列表对 pandas 多索引数据框进行切片 [重复]