python pandas如何复制有关索引列的列值

时间:2016-12-21 10:38:29

标签: python pandas

注意:问题已被编辑和扩展,因为它最初缺乏精确度。 第一个例子介绍了这个问题,但只应被视为一个介绍

有两个数据集如下:

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。

2 个答案:

答案 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)