在pandas数据框中添加具有恒定值的列。
在pandas数据框中添加具有恒定值的列。
给定一个DataFrame:\n
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
\n最简单的方法是如何添加一个包含常量值(例如0)的新列?\n
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
\n
\n这是我的解决方案,但是我不知道为什么会在\'new\'列中放入NaN值?\n
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
问题:如何向pandas数据框中添加一个具有常量值的列?
在这个问题中,当我们将一个常数值赋给一个列时,会出现NaN的原因是因为df.index和右侧对象的Index不同。
pandas试图尽可能地对齐索引,但当索引不对齐时,会在不对齐的位置出现NaN。可以通过调整索引的方式来实现对齐。
下面的代码示例展示了如何使用DataFrame.align()方法对部分对齐的索引进行对齐:
from pandas import DataFrame from numpy.random import randint df = DataFrame({'a': randint(3, size=10)}) s = df.a[:5] dfa, sa = df.align(s, axis=0)
通过上述代码,我们可以看到df和s的索引部分对齐后,dfa的结果如下:
a 0 0 1 2 2 0 3 1 4 0 5 0 6 0 7 0 8 0 9 0
而sa的结果如下:
0 0 1 2 2 0 3 1 4 0 5 NaN 6 NaN 7 NaN 8 NaN 9 NaN Name: a, dtype: float64
上面的代码没有直接回答问题,但通过演示对齐方法,能够帮助我们了解索引对齐是如何工作的。
要向pandas数据框中添加一个具有常量值的列,我们可以使用DataFrame.align()方法对齐索引,然后将常数值赋给对齐后的列。
问题的原因是想要在pandas的数据框中添加一个带有常数值的列。解决方法有两种:
一种是使用直接赋值的方法,在原数据框上进行就地修改。这种方法会将赋值广播到每一行。
import pandas as pd df = pd.DataFrame('x', index=range(4), columns=list('ABC')) df['new'] = 'y' df
另一种方法是使用`df.assign()`方法生成一个副本。这种方法可以同时添加多列,并且可以指定新列的类型。
df.assign(new='y')
如果需要同时添加多列并指定不同的值和类型,可以通过传入一个字典来实现。
c = {'new1': 'w', 'new2': 'y', 'new3': 'z'} df.assign(**c)
以上是解决问题的方法,但是在添加空列表列时需要注意一些问题:
- `object`类型的列在性能方面不好,建议重新思考数据结构。
- 可以考虑使用稀疏数据结构来存储数据。
- 如果必须存储列表列,则需要确保不要复制相同的引用多次,可以使用列表推导式来实现。
df['new'] = [[] for _ in range(len(df))]
最后,如果想要定义新添加列的类型(dtype),是否有一种优雅的方法呢?