问题:将具有恒定值的列添加到pandas数据框[重复]
给定一个DataFrame:
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
添加包含常量值(例如0)的新列的最简单方法是什么?
          A         B         C  new
1  1.764052  0.400157  0.978738    0
2  2.240893  1.867558 -0.977278    0
3  0.950088 -0.151357 -0.103219    0
这是我的解决方案,但我不知道为什么这会将NaN放入“新”列?
df['new'] = pd.Series([0 for x in range(len(df.index))])
          A         B         C  new
1  1.764052  0.400157  0.978738  0.0
2  2.240893  1.867558 -0.977278  0.0
3  0.950088 -0.151357 -0.103219  NaN
回答 0
之所以将其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
回答 1
超简单的就地分配: df['new'] = 0
对于就地修改,执行直接分配。熊猫会为每一行广播此任务。
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
对象列的注释
如果要添加一列空列表,这是我的建议:
- 考虑不这样做。object列对于性能而言是个坏消息。重新考虑数据的结构。
- 考虑将数据存储在稀疏数据结构中。详细信息:稀疏数据结构
- 如果必须存储一列列表,请确保不要多次复制相同的引用。 - # Wrong df['new'] = [[]] * len(df) # Right df['new'] = [[] for _ in range(len(df))]
生成副本: df.assign(new=0)
如果您需要副本,请使用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
回答 2
使用现代大熊猫,您可以:
df['new'] = 0
回答 3
这是另一种使用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
	声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

