我想将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使用at
对我也不起作用。
答案 0 :(得分:4)
Pandas从未被设计为容纳系列/列中的列表。您可以炮制昂贵的解决方法,但不建议使用这些方法。
不建议连续使用列表的主要原因是,您失去了使用连续内存块中保存的NumPy数组的矢量化功能。您的系列将是object
dtype,它表示一系列指针,非常类似于list
。您将在内存和性能以及访问优化的Pandas方法方面失去好处。
另请参见What are the advantages of NumPy over regular Python lists?,支持熊猫的论点与针对NumPy的论点相同。
也就是说,由于您要反对熊猫的目的和设计,所以许多人面临着相同的问题并提出了类似的问题:
答案 1 :(得分: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数组所具有的矢量化功能。
答案 2 :(得分:0)
您的回答很简单: 选择要转换为列表的列
my_list = df["col1"].tolist()
>>> df = pd.DataFrame({'col1': [1, 2, 3], 'col2': [4, 5, 6]})
>>> df
col1 col2
0 1 4
1 2 5
2 3 6
>>> my_list = df["col1"].tolist()
>>> my_list
[1, 2, 3]
答案 3 :(得分:0)
您可以尝试以下代码:
list1=[1,2,3]
list2=[4,5,6]
col=[str(“,”.join(map(str, list1))), str(“,”.join(map(str, list2)))]
df=pd.DataFrame(np.random.randint(low=0, high=0, size(5,2)), columns=col)
print(df)
希望这是预期的输出:
答案 4 :(得分:0)
也使用np.where:
df['new_col'] = np.where(df.col1 == 1, pd.Series([['a', 'b']]) , np.nan)