添加具有特定数字索引的DataFrame列,而不是就地

时间:2015-08-01 12:54:45

标签: python pandas

我有一个数据框,其列是数字索引,不一定是连续的。我想用一个特定的索引向它添加一个新列,类似于:

df[4] = [1,2,3,4]

但是没有修改现有的数据帧。 df.assign只接受kwargs(它不能直接传递给一个真正的字典),甚至将(非常kludgy)扩展非str键控dict作为kwargs的方法明确防范:

>>> df.assign(**{4: [1,2,3,4]})
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: assign() keywords must be strings

使用pd.concat 工作,但有很多线路噪音:

>>> a
   4  0  1  2  3
0  1  1  2  3  4
1  2  2  3  5  4
>>> pd.concat([a, pd.DataFrame({6: [1,2]})], axis=1)
   4  0  1  2  3  6
0  1  1  2  3  4  1
1  2  2  3  5  4  2

有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

Join将返回一个副本,而不是影响现有的数据帧(在匹配的索引上连接两个数据帧):

>>> a.join(pd.DataFrame({6: [1,2]}))
   4  0  1  2  3  6
0  1  1  2  3  4  1
1  2  2  3  5  4  2

>>> a
   4  0  1  2  3
0  1  1  2  3  4
1  2  2  3  5  4

答案 1 :(得分:0)

并使用joinseries

In [870]: a.join(pd.Series([1,2], name=6))
Out[870]:
   4  0  1  2  3  6
0  1  1  2  3  4  1
1  2  2  3  5  4  2

In [871]: a
Out[871]:
   4  0  1  2  3
0  1  1  2  3  4
1  2  2  3  5  4

或者,使用assign的另一种hacky方法是将字符串列重命名为int

In [892]: a.assign(**{'6': [1,2]}).rename(columns=pd.to_numeric)
Out[892]:
   4  0  1  2  3  6
0  1  1  2  3  4  1
1  2  2  3  5  4  2