按索引和列合并两个数据帧

时间:2017-09-05 12:40:04

标签: python pandas merge

我有两个数据框,如下所示:

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中没有相应的rownames的字符。

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

  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, .)非常简单                    Scenario: Some simple scenario Given I logged in as <local> user When I visit home page Then I should see <local> logo Examples: User |local| |UK | #ignore 'Spain' |Spain| 函数。

但我怎么能在熊猫中做到这一点?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

你可以做点什么

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 :(得分:0)

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