将列表设置为pandas数据帧

时间:2016-07-11 12:53:28

标签: python list pandas

假设我有一个数据框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),同样的问题

3 个答案:

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