簡體   English   中英

如何將整個列表分配給 pandas dataframe 的每一行

[英]how to assign an entire list to each row of a pandas dataframe

我有一個 dataframe 和一個列表

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

我想在 dataframe 的每一行中有一個列表作為元素。如果我喜歡這里

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]

首先,我認為在熊貓中使用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]

一種使用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]

只是用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使用insert(所以應該是數據幀中的第三個col)

>>> 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]

那應該工作:

df = pd.DataFrame({'A':[1,2,3], 'B':[4,5,6]})
my_list = [10, 20, 30, 40]
df['C'] = [my_list] * df.shape[0]
df

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

這是另一種解決方案。 它利用lambda並以“Pythonically”方式做事。 我覺得它更容易閱讀。

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

在此輸入圖像描述

我同意@jezrael 的觀點,使用 pandas 中的列表不是個好主意。 還有一種更快的矢量化方式:

  1. 將列表壓縮到單個 numpy 單元格中。
  2. 平鋪該單元格並將其分配給 DF。
df = pd.DataFrame(index=np.arange(1e6))
mylist= [10,20,30,40,50]

#ORIGINAL:
%%timeit -n 100 
df['C'] = [mylist for i in df.index]
>>> 188 ms ± 922 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

# VECTORIZED:
%%timeit -n 100 
q = np.array([1,], dtype=object)   # dummy array, note the dtype
q[0] = mylist                      # squeeze the list into single cell
df['C'] = np.tile(q, df.shape[0])  # tile and assign
>>> 12.1 ms ± 44.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

對於較大的 DF 尺寸,增益特別高。 (在本例中為 15x)希望有一種更優雅的方法可以將列表放入單個 numpy 單元格中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM