如何将整个列表分配给pandas数据帧的每一行

00_*_*_00 4 python list dataframe pandas

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

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

我希望在数据帧的每一行中都有一个列表作为元素.如果我喜欢这里,

df['C'] = mylist
Run Code Online (Sandbox Code Playgroud)

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]
Run Code Online (Sandbox Code Playgroud)

MEd*_*win 8

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

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
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


Abh*_*bhi 7

使用的一种替代方法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]
Run Code Online (Sandbox Code Playgroud)

?


jez*_*ael 6

首先,我认为list在大熊猫中使用s并不是一个好主意.

但是有可能通过列表理解:

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]
Run Code Online (Sandbox Code Playgroud)

  • pandas喜欢每列使用同类数据,每列包含特定的数据类型.这有助于加速在熊猫中完成的任何计算.而python列表可以包含任何类型的数据.这是我的理解,可能是我的错!@ 00__00__00 (2认同)

Kar*_*mar 5

只是为了用 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]
Run Code Online (Sandbox Code Playgroud)

或者,永久添加到 DataFrame

df = df.assign(C =  [mylist for i in df.index])
Run Code Online (Sandbox Code Playgroud)

另一种方法是用 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]
Run Code Online (Sandbox Code Playgroud)