我有來自兩個來源的相同資料。兩者都在 pandas 中DataFrame。一些事情正在發生:
- 由于一些舊軟體的讀取錯誤,來自一個
source 1(左)的資料只是來自source 2(右)的資料的一個子集。 - 來自的資料
source 2有一個額外的列。 - 兩個資料源都可能包含有效的重復值。
- 兩者之間沒有共享的唯一鍵。
期望的結果
- 我想合并兩者,保持交集。
- 僅當兩個資料幀中都存在重復項時才應保留重復項。這似乎很困難,因為兩個資料幀的長度不同并且不共享唯一鍵。
- 第二個資料框中的額外列應位于新的合并資料框中。
作業示例/我嘗試過的
這是一個簡單的例子:
df1 = pd.DataFrame(
{ # last entry a duplicate of the first
'var1' : [1, 2, 3, 1,],
'var2' : ['a', 'b', 'c', 'a']
}
)
df2 = pd.DataFrame(
{ # last two entries duplicates of first two.
'cat': [1, 2, 3, 4, 1, 2],
'var1' : [1, 2, 3, 4, 1, 2],
'var2' : ['a', 'b', 'c', 'd', 'a', 'b']
}
)
merged = pd.merge(df1, df2, on=["var1", "var2"], how="inner")
merged
結果是:
# - indicates undesired duplicates
var1 var2 cat
0 1 a 1
1 1 a 1
2 1 a 1 #
3 1 a 1 #
4 2 b 2
5 2 b 2 #
6 3 c 3
但我期待的是(順序無關緊要):
var1 var2 cat
0 1 a 1
1 1 a 1
2 2 b 2
3 3 c 3
我看了一下洗掉重復項,但它不會區分和破壞有價值的資訊。
merged.drop_duplicates()
var1 var2 cat
0 1 a 1
4 2 b 2
6 3 c 3
我的一個想法是想出一種方法,在合并和洗掉兩列都不為真的任何行之前,再有兩個二進制列來標識源。
var1 var2 cat src1 src2
0 1 a 1 1 1
1 1 a 1 1 1
2 1 a 1 0 1 # drop
3 1 a 1 0 1 # drop
4 2 b 2 1 1
5 2 b 2 0 1 # drop
6 3 c 3 1 1
但是,我不確定如何在合并期間實作這種標記(如果可能的話)。
題:
因此,簡而言之,問題是“如何合并兩個表,僅當兩個表中都存在重復項時才允許保留重復項”?
uj5u.com熱心網友回復:
嘗試與列舉合并:
key_cols = ['var1','var2']
(df1.assign(enum=df1.groupby(key_cols).cumcount())
.merge(df2.assign(enum=df2.groupby(key_cols).cumcount()),
on=['enum'] key_cols, how='inner')
.drop('enum', axis=1)
)
輸出:
var1 var2 cat
0 1 a 1
1 2 b 2
2 3 c 3
3 1 a 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/337164.html
