将具有常量值的列添加到pandas数据帧

时间:2014-06-04 13:39:10

标签: python pandas

我不知道为什么这会将NaN纳入“新”列?

df['new'] = pd.Series([0 for x in range(len(df.index))])

4 个答案:

答案 0 :(得分:20)

使用现代大熊猫,您可以:

df['new'] = 0

答案 1 :(得分:17)

NaN放入列中的原因是df.index和右侧对象的Index不同。 @zach显示了分配新的零列的正确方法。通常,pandas尝试尽可能多地对齐索引。一个缺点是,当索引未对齐时,只要 未对齐,就会得到NaN。使用reindexalign方法来获取一些直觉,以便对齐具有部分,完全和非对齐所有对齐索引的对象。例如,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