如何将整个列表分配给熊猫数据框的每一行

Posted

技术标签:

【中文标题】如何将整个列表分配给熊猫数据框的每一行【英文标题】: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 一个想到的基本用例在此之后立即爆发。 【参考方案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

以上是关于如何将整个列表分配给熊猫数据框的每一行的主要内容,如果未能解决你的问题,请参考以下文章

来自另一个数据框的熊猫多索引分配

如何在循环中将不同大小的列表附加到空熊猫数据框的每一列?

如何循环遍历熊猫数据框,并有条件地将值分配给变量的一行?

如何在熊猫数据框的每一行中找到选定列中的两个最低值?

从熊猫字典列表中提取元素

如何将一个熊猫数据框的一列与另一个数据框的每一列相加?