繁体   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