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

yem*_*emu 74 python pandas

我不知道为什么这会让NaN进入"新"栏目?

np.random.seed(0)
df = pd.DataFrame(np.random.randn(3, 3), columns=list('ABC'), index=[1, 2, 3])
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
Run Code Online (Sandbox Code Playgroud)

Rok*_*jic 32

使用现代熊猫,您可以这样做:

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

  • 您能指出哪些具体答案已经过时吗?让我们在它们下面留下评论,以便作者有机会改进。 (2认同)

cs9*_*s95 25

超级简单:直接分配

对于就地修改,执行直接分配。熊猫会为每一行广播此任务。

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

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

生成副本: DataFrame.assign

如果您需要副本,请使用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
Run Code Online (Sandbox Code Playgroud)

而且,如果您需要分配多个具有相同值的列,这很简单,

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

多列分配
最后,如果需要分配具有不同值的多列,则可以使用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
Run Code Online (Sandbox Code Playgroud)


Phi*_*oud 19

这使之所以NaN成一列是因为df.indexIndex你右手边的对象是不同的.@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
Run Code Online (Sandbox Code Playgroud)

  • 我没有拒绝投票,但是您的代码缺少注释,因此很难按照您的意图在代码段中实现 (7认同)
  • 这并不能真正回答问题。OP正在询问如何添加包含常量值的新列。 (7认同)
  • 我认为问题在于问题而不是你的答案。这篇文章中包含两个不同的问题,因此需要两个不同的答案来回答这个问题。我认为这应该被标记为过于宽泛,并且发帖者应该提出两个单独的问题。 (2认同)

Gra*_*non 9

这是使用 lambdas 的另一个班轮(创建具有常量值 = 10 的列)

df['newCol'] = df.apply(lambda x: 10, axis=1)
Run Code Online (Sandbox Code Playgroud)

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

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

  • `df['newCol'] = 10` 也是单行(并且速度更快)。这里使用apply有什么好处呢? (5认同)
  • 并不是想在这里与你竞争——只是展示一种替代方法。 (3认同)
  • @cs95 这很有帮助。我想创建一个新列,其中每个值都是一个单独的空列表。只有这个方法有效。 (2认同)
  • 对于像我这样的初学者来说,我更喜欢这个解决方案。“df.apply”函数可用于解决各种问题,这个用例*有意义*。另一方面,`df['newCol'] = 10`很容易使用并且工作起来“神奇”,**但是**它具有很多逻辑意义,并且是人们只需要熟记的东西。 (2认同)