【问题标题】:how to assign an entire list to each row of a pandas dataframe如何将整个列表分配给熊猫数据框的每一行
【发布时间】:2019-04-06 13:31:06
【问题描述】:

我有一个数据框和一个列表

df = pd.DataFrame({'A':[1,2,3], 'B':[4,5,6]})
mylist= [10,20,30,40,50]

我想在数据框的每一行中都有一个列表作为元素。如果我喜欢here

df['C'] = mylist

Pandas 试图每行广播一个值,所以我收到错误 Length of values does not match length of index

   A  B   C
0  1  4  [10,20,40,50]
1  2  5  [10,20,40,50]
2  3  6  [10,20,40,50]

【问题讨论】:

  • 您为什么要这样做? .. 似乎是 XY 问题。
  • @jpp 一个想到的基本用例在此之后立即爆发。

标签: python pandas list dataframe


【解决方案1】:

使用np.tile 的另一种选择:

df['C'] = np.tile(mylist, (len(df),1)).tolist()

print (df)

   A  B                     C
0  1  4  [10, 20, 30, 40, 50]
1  2  5  [10, 20, 30, 40, 50]
2  3  6  [10, 20, 30, 40, 50]

【讨论】:

    【解决方案2】:

    只是为了用 df.assign 完成我之前的回答,从 @jezrael 借来的列表理解

    >>> df
       A  B
    0  1  4
    1  2  5
    2  3  6
    
    >>> df.assign(C =  [mylist for i in df.index])
       A  B                     C
    0  1  4  [10, 20, 30, 40, 50]
    1  2  5  [10, 20, 30, 40, 50]
    2  3  6  [10, 20, 30, 40, 50]
    

    或者,永久添加到 DataFrame

    df = df.assign(C =  [mylist for i in df.index])
    

    另一种方式 df.insert

    因为我们正在指定列的顺序,因此可以使用插入 在这里通过在索引 2 处插入(所以应该是数据框中的第三列)

    >>> df.insert(2, 'C', '[10, 20, 30, 40, 50]') # directly assigning the list
    >>> df
       A  B                     C
    0  1  4  [10, 20, 30, 40, 50]
    1  2  5  [10, 20, 30, 40, 50]
    2  3  6  [10, 20, 30, 40, 50]
    

    【讨论】:

    • 如果我在 .iloc 选择 ''df.loc[col==val,:].assign(C=mylist)'' 之上执行此操作,则会失败为 ValueError: Length of values与索引长度不匹配
    • 这仍然会产生同样的ValueError
    【解决方案3】:

    这是另一种解决方案。它利用lambda 并以“Python 方式”做事。我认为它更容易阅读。

    import pandas as pd
    df = pd.DataFrame({'A':[1,2,3], 'B':[4,5,6]})
    mylist= [10,20,30,40,50]
    df['combined'] = df.apply(lambda x: mylist, axis=1)
    df
    

    【讨论】:

      【解决方案4】:

      首先我认为在 pandas 中使用 lists 不是 good idea

      但可以通过列表理解来实现:

      df['C'] = [mylist for i in df.index]
      #another solution
      #df['C'] = pd.Series([mylist] * len(df))
      
      print (df)
      
         A  B                     C
      0  1  4  [10, 20, 30, 40, 50]
      1  2  5  [10, 20, 30, 40, 50]
      2  3  6  [10, 20, 30, 40, 50]
      

      【讨论】:

      • 为什么不推荐
      • @00__00__00 - 稍等
      • pandas 喜欢每列处理同质数据,每列包含特定的数据类型。这有助于加速在 pandas 中完成的任何计算。而 python list 可以包含任何类型的数据。这是我的理解,可能我错了! @00__00__00
      猜你喜欢
      • 2019-08-20
      • 2020-04-13
      • 2019-06-19
      • 1970-01-01
      • 2020-09-08
      • 1970-01-01
      • 2023-03-31
      • 2018-11-10
      • 2021-02-09
      相关资源
      最近更新 更多