2017-08-24 59 views
-1

之間是相同的我怎麼能爲了得到df3擁有的df1df2具有相同指數(和相同的價值觀中的列)的行合併2數據框中df1df2提取切片這兩個dataframes

df1 = pd.DataFrame({'A': ['A0', 'A2', 'A3', 'A7'], 
         'B': ['B0', 'B2', 'B3', 'B7'], 
         'C': ['C0', 'C2', 'C3', 'C7'], 
         'D': ['D0', 'D2', 'D3', 'D7']}, 
         index=[0, 2, 3,7]) 

試驗1

df2 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A7'], 
        'B': ['B0', 'B1', 'B2', 'B7'], 
        'C': ['C0', 'C1', 'C2', 'C7'], 
        'D': ['D0', 'D1', 'D2', 'D7']}, 
        index=[0, 1, 2, 7]) 

試驗2

df2 = pd.DataFrame({'A': ['A1'], 
        'B': ['B1'], 
        'C': ['C1'], 
        'D': ['D1']}, 
        index=[1]) 

預期輸出測試1

Out[13]: 
    A B C D 
0 A0 B0 C0 D0 
2 A2 B2 C2 D2 
7 A7 B7 C7 D7 

預期輸出測試2

Empty DataFrame 
Columns: [A, B, C, D] 
Index: [] 
+0

是,一個選擇是使用CONCAT,但它不檢查值.. – gabboshow

+0

我們的答案是否有效? –

回答

1

首先得到指標。接下來,查找所有列都相同的所有行,然後將其索引到任一數據框中。

idx = df1.index & df2.index 
df_out = df1.loc[(df1.loc[idx] == df2.loc[idx]).all(1).index] 

print(df_out) 

您還可以使用df.isin(略從對方的回答不同):

df_out = df1[df1.isin(df2).all(1)] 
print(df_out) 

測試1

A B C D 
0 A0 B0 C0 D0 
2 A2 B2 C2 D2 
7 A7 B7 C7 D7 

測試2

Empty DataFrame 
Columns: [A, B, C, D] 
Index: [] 
0

我相信這是愛茉莉Python的解決方案:

df1[df2.isin(df1)].dropna() 

給出:

A B C D 
0 A0 B0 C0 D0 
2 A2 B2 C2 D2 
7 A7 B7 C7 D7 
0
pd.merge(df1.reset_index(), df2.reset_index()).set_index('index') 

這增加了每個數據幀爲一列的索引,然後連接上的所有列(現在包含索引),然後將索引設置回原始值。

0

或者你可以試試這個。

對於測試1

df1['index']=df1.index 
df2['index']=df2.index 
df1['Mark']=df1.apply(lambda x : ' '.join(x.astype(str)),axis=1) 
df2['Mark']=df2.apply(lambda x : ' '.join(x.astype(str)),axis=1) 
df1[df1.Mark.isin(df2.Mark)].drop(['Mark','index'],1) 


Out[20]: 
    A B C D 
0 A0 B0 C0 D0 
2 A2 B2 C2 D2 
7 A7 B7 C7 D7 

對於測試2

Out[28]: 
Empty DataFrame 
Columns: [A, B, C, D] 
Index: []