我不知道为什么这会将NaN纳入“新”列?
df['new'] = pd.Series([0 for x in range(len(df.index))])
答案 0 :(得分:20)
使用现代大熊猫,您可以:
df['new'] = 0
答案 1 :(得分:17)
将NaN
放入列中的原因是df.index
和右侧对象的Index
不同。 @zach显示了分配新的零列的正确方法。通常,pandas
尝试尽可能多地对齐索引。一个缺点是,当索引未对齐时,只要 未对齐,就会得到NaN
。使用reindex
和align
方法来获取一些直觉,以便对齐具有部分,完全和非对齐所有对齐索引的对象。例如,DataFrame.align()
如何使用部分对齐的索引:
In [7]: from pandas import DataFrame
In [8]: from numpy.random import randint
In [9]: df = DataFrame({'a': randint(3, size=10)})
In [10]:
In [10]: df
Out[10]:
a
0 0
1 2
2 0
3 1
4 0
5 0
6 0
7 0
8 0
9 0
In [11]: s = df.a[:5]
In [12]: dfa, sa = df.align(s, axis=0)
In [13]: dfa
Out[13]:
a
0 0
1 2
2 0
3 1
4 0
5 0
6 0
7 0
8 0
9 0
In [14]: sa
Out[14]:
0 0
1 2
2 0
3 1
4 0
5 NaN
6 NaN
7 NaN
8 NaN
9 NaN
Name: a, dtype: float64
答案 2 :(得分:4)
对于就地修改,执行直接分配。熊猫在每一行广播此作业。
df = pd.DataFrame('x', index=range(4), columns=list('ABC'))
df
A B C
0 x x x
1 x x x
2 x x x
3 x x x
df['new'] = 'y'
# Same as,
# df.loc[:, 'new'] = 'y'
df
A B C new
0 x x x y
1 x x x y
2 x x x y
3 x x x y
如果您需要副本,请使用DataFrame.assign
:
df.assign(new='y')
A B C new
0 x x x y
1 x x x y
2 x x x y
3 x x x y
而且,如果您需要分配多个具有相同值的列,这很简单,
c = ['new1', 'new2', ...]
df.assign(**dict.fromkeys(c, 'y'))
A B C new1 new2
0 x x x y y
1 x x x y y
2 x x x y y
3 x x x y y
最后,如果需要分配多个具有不同值的列,则可以将assign
与字典一起使用。
c = {'new1': 'w', 'new2': 'y', 'new3': 'z'}
df.assign(**c)
A B C new1 new2 new3
0 x x x w y z
1 x x x w y z
2 x x x w y z
3 x x x w y z
答案 3 :(得分:4)
这是另一个使用lambdas的班轮(创建常数值为10的列)
df['newCol'] = df.apply(lambda x: 10, axis=1)
之前
df
A B C
1 1.764052 0.400157 0.978738
2 2.240893 1.867558 -0.977278
3 0.950088 -0.151357 -0.103219
之后
df
A B C newCol
1 1.764052 0.400157 0.978738 10
2 2.240893 1.867558 -0.977278 10
3 0.950088 -0.151357 -0.103219 10