【问题标题】:merge two data frames by index and column [duplicate]按索引和列合并两个数据框[重复]
【发布时间】:2017-09-05 12:40:03
【问题描述】:

我有两个数据框,像这样:

df1 = pd.DataFrame()
df1['v1'] = [5,7,2,4,9,7,2]
df1['v2'] = ["a1", 'nan', "a2", "a3", "a5", "a6", "a9"]

   v1   v2
0   5   a1
1   7  nan
2   2   a2
3   4   a3
4   9   a5
5   7   a6
6   2   a9

dfa = pd.DataFrame()
dfa['pc1'] = np.random.rand(5)
dfa['pc2'] = np.random.rand(5)
dfa['idx'] = ["a1", "a2", "a3", "a6", "a9"]
df2 = dfa.set_index('idx')

          pc1       pc2
idx                    
a1   0.048725  0.050773
a2   0.289110  0.302272
a3   0.720966  0.663910
a6   0.021616  0.308114
a9   0.205923  0.583591

df1 有一个列 v2,其中包含与 df2 的索引匹配的字符值。但它也有 nan 并且可能包含 df2 中不存在相应行名的字符。

我现在想将这些数据框合并为一个,如下所示:

  v1    v2       pc1       pc2
0  5   a1   0.048725  0.050773
1  7  nan        nan       nan
2  2   a2   0.289110  0.302272
3  4   a3   0.720966  0.663910
4  9   a5        nan       nan
5  7   a6   0.021616  0.308114
6  2   a9   0.205923  0.583591

R 中,使用rownames_to_column(df2, "v2")left_join(df1, .) 函数。

但是我如何在 pandas 中做到这一点?

【问题讨论】:

  • 顺便说一句,set_index 调用以某种方式使事情复杂化。这不是必需的,您可以分别为每个帧传递连接参数。因此,如果您使用例如,您始终可以避免按索引加入。 reset_index()

标签: python pandas merge


【解决方案1】:

你可以做类似的事情

pd.merge(df1, df2, left_on = 'v2', right_index=True, how = 'left')

这会产生:

   v1   v2       pc1       pc2
0   5   a1  0.048725  0.050773
1   7  NaN       NaN       NaN
2   2   a2   0.28911  0.302272
3   4   a3  0.720966   0.66391
4   9   a5       NaN       NaN
5   7   a6  0.021616  0.308114
6   2   a9  0.205923  0.583591

【讨论】:

    【解决方案2】:

    更新:

    In [37]: df1.merge(df2, right_index=True, left_on='v2', how='outer')
    Out[37]:
       v1   v2       pc1       pc2
    0   5   a1  0.252062  0.602530
    1   7  nan       NaN       NaN
    2   2   a2  0.328666  0.988321
    3   4   a3  0.704342  0.809817
    4   9   a5       NaN       NaN
    5   7   a6  0.001230  0.602590
    6   2   a9  0.635444  0.926872
    

    In [33]: df2.merge(df1, left_index=True, right_on='v2', how='outer')
    Out[33]:
            pc1       pc2  v1   v2
    0  0.252062  0.602530   5   a1
    2  0.328666  0.988321   2   a2
    3  0.704342  0.809817   4   a3
    5  0.001230  0.602590   7   a6
    6  0.635444  0.926872   2   a9
    1       NaN       NaN   7  nan
    4       NaN       NaN   9   a5
    

    【讨论】:

    • 谢谢,为什么现在没有对索引进行排序,如何按索引再次对行进行排序?
    • @spore234,在这种情况下,您想将df1 放在首位 - 请参阅更新后的答案...
    【解决方案3】:
    pd.merge(df2.reset_index(), df1, left_on='idx', right_on='v2', how='outer').drop('idx', axis=1)
    
    
    Output:
    
                pc1            pc2      v1    v2
      0      0.760966       0.059443    5     a1
      1      0.059443       0.984703    2     a2
      2      0.214868       0.677140    4     a3
      3      0.224410       0.037784    7     a6
      4      0.297342       0.341810    2     a9
      5        NaN            NaN       7     nan
      6        NaN            NaN       9     a5
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-20
      • 2015-10-28
      • 2018-10-30
      • 2021-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多