我有一个包含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)]
使用相同的结果,指向'='符号。
我做错了什么?
答案 0 :(得分:3)
使用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
VS
1000 loops, best of 3: 567 µs per loop # John Galt
df * 10000
)1000 loops, best of 3: 607 µs per loop # mine
VS
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
请注意,基于循环的分配也是节省空间的。
答案 1 :(得分:1)
使用
<强> 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