我想将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)
我试图将设置dtype为listusing df.new_col = df.new_col.astype(list),但这也不起作用。
我想知道什么是正确的方法。
编辑
这里提供的答案:Python的大熊猫插入列表进入细胞使用at并没有为我工作,无论是。
不容易,一种可能的解决方案是 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 数组的矢量化功能。
熊猫从来没有被设计成容纳系列/专栏的列表。您可以炮制昂贵的解决方法,但不建议这样做。
不推荐连续使用列表的主要原因是,您失去了使用连续内存块中保存的NumPy数组的矢量化功能。您的系列将是objectdtype,它表示一系列指针,非常类似于list。您将在内存和性能以及访问优化的Pandas方法方面失去好处。
另请参见与常规Python列表相比NumPy有哪些优势?支持熊猫的论点与针对NumPy的论点相同。
就是说,由于您违背了Pandas的宗旨和设计,因此许多人面临着相同的问题并提出了类似的问题: