我有一个数据框,其列是数字索引,不一定是连续的。我想用一个特定的索引向它添加一个新列,类似于:
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
有更好的方法吗?
答案 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)
并使用join
和series
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