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)
| 归档时间: |
|
| 查看次数: |
11923 次 |
| 最近记录: |