簡體   English   中英

如何在多列上合並,然后如果沒有匹配項,則在 Pandas 中的不同列上合並?

[英]How to merge on multiple columns and then if there is not a match, merge on different columns in pandas?

這並不容易放在一個句子中,基本上,我有兩個數據集,我想在兩個數據點上組合——名稱和日期。 我在這里提供了一個關於數據結構的簡短示例: https : //ethercalc.net/a4k8lejblmhe

Year    Name    Alternative Name    Favorite Pet
1998    William Bill                Cat
1995    James   Jim                 Dog
1956    Robert  Bob                 Hamster
Year    Name     Sales
1998    William  2000
1995    Jim      3005
1956    Bob      6000

預期的:

Year    Name    Sales   Favorite Pet
1998    William 2000    Cat
1995    Jim     3005    Dog
1956    Bob     6000    Hamster

但是,其中一個數據集同時具有名稱和替代名稱。 這些是相當大的數據集,所以我想通過合並名稱和替代名稱和日期來涵蓋我的所有基礎。 我知道如何結合年份和名稱:

nameCombined = names1.merge(names2, left_on=["year", "name"], right_on=["year", "name"], how='left')

話雖如此,使用某種條件的最佳方法是說如果年份和常規名稱之間不匹配,則在為合並分配空值之前檢查年份和備用名稱?

["Year", "Name"]左合並,然后在["Year", "Alternative Name"]上左合並(單獨)然后組合它們並刪除重復項。

這假設原始順序無關緊要,如果它確實告訴我,我會告訴你如何保持它。

nameCombined = names1[["Year", "Name", "Favorite Pet"]].merge(names2, left_on=["Year", "Name"], right_on=["Year", "Name"], how='left')

AlternativeNameCombined = names1[["Year", "Alternative Name", "Favorite Pet"]].merge(names2, left_on=["Year", "Alternative Name"], right_on=["Year", "Name"], how='left')
AlternativeNameCombined.columns = ["Year", "Name", "Sales", "Favorite Pet"]

allCombined = nameCombined.append(AlternativeNameCombined).drop_duplicates(subset=["Year", "Name"], keep="first").reset_index(drop=True)

這是一個使用2 inner join + concat的示例:

df1 = pd.DataFrame({
    'Year': (1998, 1995, 1956,),
    'Name': ('William', 'James', 'Robert'),
    'Alternative Name': ('Bill', 'Jim', 'Bob'),
    'Favorite Pet': ('Cat', 'Dog', 'Hamster'),
})

df2 = pd.DataFrame({
    'Year': (1998, 1995, 1956,),
    'Name': ('William', 'Jim', 'Bob'),
    'Sales': (2000, 3005, 6000),
})

# by Name
df = df1.drop(columns=['Alternative Name']).merge(df2, on=['Year', 'Name'])
# by Alternative Name
df1 = df1.drop(columns=['Name']).rename(columns={'Alternative Name': 'Name'})
# union
df = pd.concat([
    df,
    df2.merge(df1, on=['Year', 'Name'])
], sort=False)

print(df)
#    Year     Name Favorite Pet  Sales
# 0  1998  William          Cat   2000
# 0  1995      Jim          Dog   3005
# 1  1956      Bob      Hamster   6000

暫無
暫無

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

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