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

时间:2018-09-28 09:23:12

标签: 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

我尝试使用dtypelist设置为df.new_col = df.new_col.astype(list),但这也不起作用。

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


编辑

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

5 个答案:

答案 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)