假设我有一个数据框df
,我想创建一个填充0的新列,我使用:
df['new_col'] = 0
到目前为止,没问题。但是如果我想要使用的值是一个列表,它就不起作用:
df['new_col'] = my_list
ValueError: Length of values does not match length of index
我理解为什么这不起作用(pandas试图为列的每个单元分配一个列表值),但是我们怎样才能避免这种行为呢? (如果不清楚我希望我的新列的每个单元格都包含相同的预定义列表)
注意:我也尝试过:df.assign(new_col = my_list)
,同样的问题
答案 0 :(得分:10)
你必须这样做:
df['new_col'] = [my_list] * len(df)
示例:
In [13]:
df = pd.DataFrame(np.random.randn(5,3), columns=list('abc'))
df
Out[13]:
a b c
0 -0.010414 1.859791 0.184692
1 -0.818050 -0.287306 -1.390080
2 -0.054434 0.106212 1.542137
3 -0.226433 0.390355 0.437592
4 -0.204653 -2.388690 0.106218
In [17]:
df['b'] = [[234]] * len(df)
df
Out[17]:
a b c
0 -0.010414 [234] 0.184692
1 -0.818050 [234] -1.390080
2 -0.054434 [234] 1.542137
3 -0.226433 [234] 0.437592
4 -0.204653 [234] 0.106218
请注意,dfs针对标量值进行了优化,存储非标量值会使我的观点失败,因为过滤,查找,获取和设置变得有问题,以至于它变得很痛苦
答案 1 :(得分:2)
请注意,如果您想修改这些列表,接受的答案可能会导致令人惊讶的行为:
df = pd.DataFrame([1, 2, 3], columns=['a'])
df['lists'] = [[]]* len(df)
df
a lists
0 1 []
1 2 []
2 3 []
df.loc[df.a == 1, 'lists'][0].append('1')
df
a lists
0 1 [1]
1 2 [1]
2 3 [1]
# oops
为避免这种情况,您必须使用每行不同的列表实例初始化 lists
列:
df['lists'] = [[] for r in range(len(df))] # note you can't use a generator
df.loc[df.a == 1, 'lists'][0].append('1')
df
a lists
0 1 [1]
1 2 []
2 3 []
不要被那里的显示所迷惑,1 仍然是一个字符串:
df.loc[df.a == 1, 'lists'][0]
['1']
答案 2 :(得分:0)
您可以使用DataFrame.apply
:
In [1]:
df = pd.DataFrame([1, 2, 3], columns=['numbers'])
my_list = ['foo', 'bar']
df['lists'] = df.apply(lambda _: my_list, axis=1)
df
Out[1]:
numbers lists
0 1 [foo, bar]
1 2 [foo, bar]
2 3 [foo, bar]
再次注意,my_list
是可变的,并在整个数据帧中共享。为避免这种情况,您可以为每一行制作一个副本:
df['lists'] = df.apply(lambda _: my_list.copy(), axis=1)