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

新手上路,请多包涵

我想将 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

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

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


编辑

此处提供的答案: Python pandas insert list into a cell using at 对我也不起作用。

原文由 Unni 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

不容易,一种可能的解决方案是创建助手 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

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

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

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

原文由 jezrael 发布,翻译遵循 CC BY-SA 4.0 许可协议

不要这样做。

Pandas 从未被设计成以系列/列的形式保存列表。您可以设计昂贵的解决方法,但不推荐使用这些方法。

不推荐以系列方式保存列表的主要原因是您失去了使用 NumPy 数组保存在连续内存块中的矢量化功能。您的系列将是 object ,代表指针序列,很像 list 。您将失去内存和性能方面的优势,也无法访问优化的 Pandas 方法。

另请参阅 NumPy 与常规 Python 列表相比有哪些优势? 支持 Pandas 的论点与支持 NumPy 的论点相同。

也就是说,由于您 违背 了 Pandas 的目的和设计,因此有很多人面临同样的问题并提出了类似的问题:

原文由 jpp 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题