这不容易放在一句话中,基本上,我有两个数据集,我想在两个数据点上组合——名称和日期。我在这里提供了一个关于数据结构的简短示例: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')
话虽如此,使用某种条件的最佳方式是什么?如果年份和常规名称不匹配,请在为合并指定null值之前检查年份和替代名称?
在["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