我有兩個資料框 Df1 和 Df2。我在 a 列上合并了 Df1,Df2。現在我想比較合并資料框的同名列,如果值不匹配,則附加在“miss_match”列中。
例如:將 b_PE 與 b_PS 進行比較,將 c_PE 與 c_PS 進行比較。如果 b_xx 的值不匹配并且 c_xx 的值不匹配,那么我們將在 mismatch 列中附加 b,c
同樣,如果 b_xx 的值匹配并且 c_xx 的值不匹配,那么我們將在不匹配列中附加 c
Df1
a b c
a '1' 1
2 '2' 5
c '3' 3
Df2
a b c
a '4' 0
2 '2' 2
c '6' 3
merged_df
a b_PE b_PS c_PE c_PS
a '4' '1' 0 1
2 '2' '2' 2 5
c '6' '3' 3 3
expected result:
a b_PE b_PS c_PE c_PS miss_match
a '4' '1' 0 1 b,c
2 '2' '2' 2 5 c
c '6' '3' 3 3 b
對此的任何建議都將非常有幫助。謝謝
uj5u.com熱心網友回復:
groupby這是在列上使用 a 的方法:
merged_df = df2.merge(df1, on='a', suffixes=('_PE', '_PS'))
group = merged_df.columns.str.replace('_.*', '', regex=True)
mask = merged_df.groupby(group, axis=1).nunique().gt(1).stack()
s = mask[mask].reset_index(level=1).groupby(level=0)['level_1'].agg(','.join).rename('miss_match')
merged_df.join(s)
輸出:
a b_PE c_PE b_PS c_PS miss_match
0 a 4 0 1 1 b,c
1 2 2 2 2 5 c
2 c 6 3 3 3 b
uj5u.com熱心網友回復:
首先使用DataFrame.mergewitha引數suffixes,然后通過轉換為 numpy 陣列比較不匹配的值,DataFrame.ne因為不同的列名并通過矩陣乘法DataFrame.dot與列名b, c(之前的值_)獲得新列:
df = df1.merge(df2, on='a', suffixes=('_PS','_PE'))
df1 = df[['b_PS','c_PS']].astype(int).ne(df[['b_PE','c_PE']].astype(int).to_numpy())
df = df[['a','b_PE','b_PS','c_PE','c_PS']]
df['miss_match'] = df1.dot(df1.columns.str.split('_').str[0] ',').str.rstrip(',')
print (df)
a b_PE b_PS c_PE c_PS miss_match
0 a 4 1 0 1 b,c
1 2 2 2 2 5 c
2 c 6 3 3 3 b
更通用的解決方案MultiIndex- 不需要指定列名:
df = df1.merge(df2, on='a', suffixes=('_PS','_PE'))
df1 = df.set_index('a').astype(int)
df1.columns = df1.columns.str.split('_', expand=True)
df1 = df1.xs('PS', level=1, axis=1).ne(df1.xs('PE', level=1, axis=1))
print (df1)
b c
a
a True True
2 False True
c True False
df['miss_match'] = df1.dot(df1.columns ',').str.rstrip(',').reset_index(drop=True)
print (df)
a b_PS c_PS b_PE c_PE miss_match
0 a 1 1 4 0 b,c
1 2 2 5 2 2 c
2 c 3 3 6 3 b
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/441272.html
上一篇:優化我的腳本,計算每周的產品數量
