注意:问题已被编辑和扩展,因为它最初缺乏精确度。 第一个例子介绍了这个问题,但只应被视为一个介绍
有两个数据集如下:
idx value other_columns
1 7
2 6
3 5
idx value ...other_columns
1 0
2 0
4 0
我想复制关于索引列的第一个数据集值(并在非匹配列上设置NaN)
获得这个:
idx value ...other_columns
1 7
2 6
4 NaN
问候
编辑:
关于我的首发帖子,EdChum的回答是正确的,但我的问题缺乏准确性。
other_columns意味着我想保持其他列不变,我的目标是在dataset2中插入来自dataset1的值。 更精确的例子:
df1= pd.DataFrame({'idx':[1,2,3], 'val':[7,6,5], 'other':[1,1,1]})
df2= pd.DataFrame({'idx':[1,2,4], 'val':[0,0,0], 'other':[1,1,1]})
df1
idx other val
0 1 1 7
1 2 1 6
2 3 1 5
df2
idx other val
0 1 7 0
1 2 7 0
2 4 7 0
我想要检索
idx other val
0 1 7 7
1 2 7 6
2 4 7 NaN
这是来自Fuego基于合并的anwser的子框架,但我还没有看到如何只保留['idx','val_x','other_y'] cols。
答案 0 :(得分:2)
使用reindex
In [142]:
df1.reindex(df2.index)
Out[142]:
value other_columns
idx
1 7.0 NaN
2 6.0 NaN
4 NaN NaN
reindex_like
也有效:
In [143]:
df1.reindex_like(df2)
Out[143]:
value ...other_columns
idx
1 7.0 NaN
2 6.0 NaN
4 NaN NaN
使用loc
的基于标签的索引:
In [144]:
df1.loc[df2.index]
Out[144]:
value other_columns
idx
1 7.0 NaN
2 6.0 NaN
4 NaN NaN
如果idx
真的是一个列,那么您需要先调用set_index
,然后再调整上述任何一个文档:
In [148]:
df1.set_index('idx').reindex(df2.set_index('idx').index).reset_index()
Out[148]:
idx value other_columns
0 1 7.0 NaN
1 2 6.0 NaN
2 4 NaN NaN
答案 1 :(得分:0)
我认为您应该使用 panda 的merge
功能:
data = panda.merge(dataframe1, dataframe2, on="idx", how="right")
您想要的结果将是第一列。
有关 how 参数的更多信息,请参阅doc(设置NaN,或只选择左,右或两者......)。
见啊!
编辑:
我看到了你的编辑,你想知道如何只提取你想要的列,但你只需要将你想要的列传递给合并:
data = panda.merge(df1[['idx', 'val']], df2.drop('val', axis=1), on="idx", how="right")
(不用担心,drop命令不会删除df2的列,它会返回没有列的DataFrame)