如何将熊猫列的值设置为列表

Unn*_*nni 3 python pandas

我想将pandas列的值设置为字符串列表。但是,我这样做没有成功,因为大熊猫将列值视为可迭代值,并且得到了:ValueError: Must have equal len keys and value when setting with an iterable

这是MWE

>> df = pd.DataFrame({'col1': [1, 2, 3], 'col2': [4, 5, 6]})
>> df
col1    col2
0   1   4
1   2   5
2   3   6

>> df['new_col'] = None
>> df.loc[df.col1 == 1, 'new_col'] = ['a', 'b']
ValueError: Must have equal len keys and value when setting with an iterable
Run Code Online (Sandbox Code Playgroud)

我试图将设置dtypelistusing df.new_col = df.new_col.astype(list),但这也不起作用。

我想知道什么是正确的方法。


编辑

这里提供的答案:Python的大熊猫插入列表进入细胞使用at并没有为我工作,无论是。

jez*_*ael 7

不容易,一种可能的解决方案是 create helper Series

df.loc[df.col1 == 1, 'new_col'] = pd.Series([['a', 'b']] * len(df))
print (df)
   col1  col2 new_col
0     1     4  [a, b]
1     2     5     NaN
2     3     6     NaN
Run Code Online (Sandbox Code Playgroud)

另一种解决方案,如果也需要将缺失值设置为空列表,则使用列表理解:

#df['new_col'] = [['a', 'b'] if x == 1 else np.nan for x in df['col1']]

df['new_col'] = [['a', 'b'] if x == 1 else [] for x in df['col1']]
print (df)
   col1  col2 new_col
0     1     4  [a, b]
1     2     5      []
2     3     6      []
Run Code Online (Sandbox Code Playgroud)

但是随后您将失去使用连续内存块中保存的 NumPy 数组的矢量化功能。


jpp*_*jpp 5

不要这样

熊猫从来没有被设计成容纳系列/专栏的列表。您可以炮制昂贵的解决方法,但不建议这样做。

不推荐连续使用列表的主要原因是,您失去了使用连续内存块中保存的NumPy数组的矢量化功能。您的系列将是objectdtype,它表示一系列指针,非常类似于list。您将在内存和性能以及访问优化的Pandas方法方面失去好处。

另请参见与常规Python列表相比NumPy有哪些优势?支持熊猫的论点与针对NumPy的论点相同。

就是说,由于您违背了Pandas的宗旨和设计,因此许多人面临着相同的问题并提出了类似的问题:

  • 顺便说一句,如果必须在一列下存储任意长的值序列,推荐的方法是什么? (3认同)
  • @Unni,熊猫可能*不是*适合您的结构。熊猫的名称源自[panel data](https://en.wikipedia.org/wiki/Panel_data)。因此,它是为存储在*数组*中的结构化数据而设计的。此数组中的每一行都已建立索引,并且不能任意长。可能与dict相结合的list可能更合适。 (2认同)