我找到了這篇文章,但這不是我的場景。有沒有比較兩個資料框的有效方法
我想比較兩個資料幀的原因是我正在尋找可能發生的變化。(想想“審計”)。這兩個框架具有完全相同的列布局,只是其中一個可能比另一個具有更多或更少的行,并且其中兩列中的值可能已更改。
ID Period Price OtherID
0 10100001 2019-10-01 8995.00 ABBD
1 38730001 2019-11-01 38227.71 EIRU
2 30100453 2019-12-01 22307.00 DDHF
3 92835543 2020-01-01 2310.00 DDGF
4 66453422 2020-02-01 12113.29 DGFH
ID Period Price OtherID
0 10100001 2019-10-01 5.00 ABBD
1 38730001 2019-11-01 38227.71 XXXX
2 30100453 2019-12-01 22307.00 DDHF
3 92835543 2020-01-01 2310.00 DDGF
4 66453422 2020-02-01 12113.29 DGFH
5 22223422 2020-02-01 123.29 HHYG
我懷疑的兩列是“Price”和“OtherID”。我想查找價格或其他 ID 中的任何更改。
我看到三種情況:
1. row has been added
2. row has been deleted
3. row doesn't match
我可以遍歷這一切,但我想知道是否有一些熊貓魔法可以一舉完成。
我尋求的輸出是這樣的:
ID Period Analysis
0 10100001 2019-10-01 Changed
1 38730001 2019-11-01 Changed
3 22223422 2020-02-01 New
需要明確的是,ID 本身并不是唯一的。而 Period 本身也不是唯一的。兩個在一起是。
uj5u.com熱心網友回復:
compare在merge您的 2 個資料幀之后使用ID和Period:
out = pd.merge(df1, df2, on=['ID', 'Period'], how='outer',
suffixes=('_df1', '_df2')).set_index(['ID', 'Period'])
out.columns = pd.MultiIndex.from_tuples(out.columns.str.split('_').map(tuple)) \
.swaplevel()
out = out['df1'].compare(out['df2'])
輸出:
>>> out
Price OtherID
self other self other
ID Period
10100001 2019-10-01 8995.0 5.00 NaN NaN
38730001 2019-11-01 NaN NaN EIRU XXXX
22223422 2020-02-01 NaN 123.29 NaN HHYG
# Summarize
>>> out.swaplevel(axis=1)['self'].isna().all(axis=1) \
.replace({True: 'New', False: 'Changed'})
ID Period
10100001 2019-10-01 Changed
38730001 2019-11-01 Changed
22223422 2020-02-01 New
dtype: object
如果附加keep_shape=True引數:
>>> out['df1'].compare(out['df2'], keep_shape=True)
Price OtherID
self other self other
ID Period
10100001 2019-10-01 8995.0 5.00 NaN NaN
38730001 2019-11-01 NaN NaN EIRU XXXX
30100453 2019-12-01 NaN NaN NaN NaN
92835543 2020-01-01 NaN NaN NaN NaN
66453422 2020-02-01 NaN NaN NaN NaN
22223422 2020-02-01 NaN 123.29 NaN HHYG
uj5u.com熱心網友回復:
我覺得你應該試試 apply
使用所需的標題制作單獨的資料幀
df_update = pd.DataFrame(updated_data,columns =['ID','PERIOD'])
然后應用這個功能
result = df1[~df1.apply(tuple,1).isin(df2.apply(tuple,1))]
它對我有用,我通過這個生成更新的條目資料框。讓我知道它是否是您想要的解決方案
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/353862.html
