如何将整个列表分配给熊猫数据框的每一行
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 中使用 list
s 不是 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以上是关于如何将整个列表分配给熊猫数据框的每一行的主要内容,如果未能解决你的问题,请参考以下文章