将列表设置为pandas数据帧的列中的值

yse*_*rka 11 python list pandas

假设我有一个数据帧df,我想创建一个填充0的新列,我使用:

df['new_col'] = 0
Run Code Online (Sandbox Code Playgroud)

这个,没问题.但是,如果我想使用的值是一个列表,它不起作用:

df['new_col'] = my_list

ValueError: Length of values does not match length of index
Run Code Online (Sandbox Code Playgroud)

我理解为什么这不起作用(pandas试图为列的每个单元格分配一个列表值),但是我们怎样才能避免这种行为呢?(如果不清楚我希望我的新列的每个单元格都包含相同的预定义列表)

注意:我也试过:df.assign(new_col = my_list),同样的问题

EdC*_*ica 12

你必须这样做:

df['new_col'] = [my_list] * len(df)
Run Code Online (Sandbox Code Playgroud)

例:

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
Run Code Online (Sandbox Code Playgroud)

请注意,dfs针对标量值进行了优化,存储非标量值会在我看来失败,因为过滤,查找,获取和设置变得有问题,以至于它变得很痛苦


Mr_*_*s_D 12

请注意,如果您想修改这些列表,接受的答案可能会导致令人惊讶的行为:

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
Run Code Online (Sandbox Code Playgroud)

为了避免这种情况,您必须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    []
Run Code Online (Sandbox Code Playgroud)

不要被那里的显示所迷惑,1 仍然是一个字符串:

df.loc[df.a == 1, 'lists'][0]
['1']
Run Code Online (Sandbox Code Playgroud)