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

时间:2017-09-07 07:46:08

标签: python list pandas dataframe list-comprehension

我有一个包含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)]

使用相同的结果,指向'='符号。

我做错了什么?

2 个答案:

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