【问题标题】: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)]

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

我做错了什么?

【问题讨论】:

    标签: python list pandas dataframe list-comprehension


    【解决方案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 循环。
      猜你喜欢
      • 1970-01-01
      • 2020-08-19
      • 2017-07-21
      • 2014-02-18
      • 2020-03-06
      • 2016-12-15
      • 2020-03-07
      • 2021-12-14
      • 2011-09-05
      相关资源
      最近更新 更多