簡體   English   中英

如何使用特定列系統地比較兩個 Pandas 數據幀中的所有行並返回差異?

[英]How do I systematically compare all rows in two Pandas dataframes using specific columns and return the differences?

我有兩個來自不同來源的大型數據框,它們的結構基本相同,但長度不同,順序也不同。 大多數數據具有可比性,但不是全部。 行代表個人,列包含有關這些個人的數據。 我想逐行檢查一個 dataframe 與“主” dataframe 的某些列值,然后返回遺漏,以便可以將它們添加到其中。

我一直在使用df.query()方法使用自己的輸入檢查個別案例,因為我可以使用多列搜索主 dataframe - 所以,像df.query('surname == "JONES" and initials == "DV" and town == "LONDON"') 我想做這樣的事情,但是通過使用來自特定列的數據創建另一個 dataframe 的每一行的查詢。

我想我可以弄清楚如何使用 for 循環和 if 語句來做到這一點,但這將非常低效並且顯然不理想 列表理解可能更有效,但我無法計算出 dataframe 比較部分,除非我創建一個新列,其數據是根據我要比較的值構建的(JONES-DV-LONDON,但這似乎是錯誤的)。

我認為 這里有一個答案,但它依賴於數據幀或多或少相同(我的不是 - 因此我希望只比較某些列)。

我一直找不到有人這樣做的例子,這可能又是我的失敗。 我是一個新手,我有一種感覺,我可能以完全錯誤的方式思考這個問題。 我非常重視任何想法和建議......

編輯- 一些示例數據(不完全是我正在使用的,但希望有助於顯示我正在嘗試做的事情)

df1 (my master list)
surname    initials    town
JONES      D V         LONDON
DAVIES     H G         BIRMINGHAM

df2
surname    initials    town
DAVIES     H G         BIRMINGHAM
HARRIS     P J         SOUTHAMPTON
JONES      D V         LONDON

我想確定要在比較中使用的列(這里的姓氏、姓名首字母、城鎮 - 假設有更多無法匹配的數據),然后從 df2 返回唯一結果 - 所以在這種情況下 dataframe 包含:

surname    initials    town
HARRIS     P J         SOUTHAMPTON

定義要加入的列:

cols = ['surname', 'initials', 'town']

比您可以使用帶有參數indicator=True的合並,它顯示數據的外觀(left_only、right_only 或兩者):

df_res = df1.merge(df2, 'outer',on=cols, indicator=True)

並排除行出現在兩個數據框中:

df_res = df_res[df_res['_merge'] != 'both']
print(df_res)

    surname initials    town        _merge
2   HARRIS  P J         SOUTHAMPTON right_only

您可以僅按 left_only 或 right 過濾。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM