问题:将具有恒定值的列添加到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