簡體   English   中英

找出兩個 Pandas Dataframes 之間的差異,並將其全部添加到新的 DF

[英]Find difference between two pandas Dataframes and and add all to new DF

我有兩個Guest-Lists ,在 DataFrames 中,我想知道刪除了哪些名稱,添加了哪些名稱,然后獲取了新的 DF,我該怎么辦?

這兩個 DF 是:

list1 = {'First Name': ['Adi', 'Beni', 'Dimi', 'Sergei'], 'Last Name': ['Beer', 'Wine', 'Liquor', 'Vodka'], 'Job': ['Brewer', 'Farmer', 'Shopowner', 'Guest']}

list2 = {'First Name': ['Adi', 'Beni', 'Sergei', 'Don'], 'Last Name': ['Beer', 'Wine', 'Vodka', 'Brown']}

如果``NameX 在list1list2 ,則創建一個新的 DataFrame ,其名稱在兩者中。

如果NameXlist1 ,但在list2退出,請在新的 df 中顯示。

如果NameX僅在list2 ,請在另一個 df 中顯示給我。

我怎么做?

順便說一句,'Job' 條目僅在一個 df 中是有意的。 目標是將其保留在新的 dfs 中。

最簡單的方法是將名字和姓氏放在一起,比較它們,然后再次將它們分開。

下面是對應的代碼:

FIRST_NAME = 'First Name'
LAST_NAME = 'Last Name'
JOB = 'Job'
KEYS = [FIRST_NAME, LAST_NAME, JOB]


def intersection(lst1, lst2):
    return [value for value in lst1 if value in lst2]


def unzip(lst):
    a = []
    b = []
    for x, y in lst:
        a.append(x)
        b.append(y)
    return a, b


def get_jobs(dct, lst):
    return [dct.get(x) for x in lst]


def get_dict(lst, dict0, keys=KEYS):
    a, b = unzip(lst)
    values = [a, b, get_jobs(dict0, lst)]
    return dict(zip(keys, values))


list1 = {FIRST_NAME: ['Adi', 'Beni', 'Dimi', 'Sergei'], LAST_NAME: ['Beer', 'Wine', 'Liquor', 'Vodka'],
         JOB: ['Brewer', 'Farmer', 'Shopowner', 'Guest']}
list2 = {FIRST_NAME: ['Adi', 'Beni', 'Sergei', 'Don'], LAST_NAME: ['Beer', 'Wine', 'Vodka', 'Brown']}

mapped1 = list(zip(list1.get(FIRST_NAME), list1.get(LAST_NAME)))
mapped2 = list(zip(list2.get(FIRST_NAME), list2.get(LAST_NAME)))
dict_jobs = dict(zip(mapped1, list1.get(JOB)))

intersec = intersection(mapped1, mapped2)
left = []
right = []

for element in set(mapped1) ^ set(mapped2):
    left.append(element) if element in mapped1 else right.append(element)

dict_intersec = get_dict(intersec, dict_jobs)
dict_left = get_dict(left, dict_jobs)
dict_rigth = get_dict(right, dict_jobs)

輸出:

{'First Name': ['Adi', 'Beni', 'Sergei'], 'Last Name': ['Beer', 'Wine', 'Vodka'], 'Job': ['Brewer', 'Farmer', 'Guest']}
{'First Name': ['Dimi'], 'Last Name': ['Liquor'], 'Job': ['Shopowner']}
{'First Name': ['Don'], 'Last Name': ['Brown'], 'Job': [None]}

dict_jobs ,合並的名稱被映射到他們的工作。 intersec是包含兩個原始列表中包含的名稱的列表。 left包含僅出現在第一個列表中的名稱, right僅包含出現在第二個列表中的名稱。

pandas.merge(...)是你要找的: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.merge.html

要一次獲得所有選項,只需執行以下操作:

df1=pd.DataFrame(list1)
df2=pd.DataFrame(list2)

df3=pd.merge(df1, df2, on=["First Name", "Last Name"], how="outer", indicator=True)

輸出:

  First Name Last Name        Job      _merge
0        Adi      Beer     Brewer        both
1       Beni      Wine     Farmer        both
2       Dimi    Liquor  Shopowner   left_only
3     Sergei     Vodka      Guest        both
4        Don     Brown        NaN  right_only

暫無
暫無

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

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