我有两个数据帧如下:
df1 = pd.DataFrame({'metro':['Santa Maria-Santa Barbara',
'New York', 'Los Angeles'],
'state':['California', 'New York', 'California']})
df2 = pd.DataFrame({'metro':['Los Angeles-Long Beach-Anaheim',
'New York-Newark-Jersey City', 'Jefferson'],
'state':['California', 'New York-New Jersey-Pennsylvania', 'Georgia']})
我想根据这个条件合并(左连接,df1是左,df2是右):
*pseudo-code*
df2['metro'].str.contains(df1['metro']) & df2['state'].str.contains(df1['state'])
编辑:
根据约翰的评论进一步澄清 -
我想要'纽约 - 新泽西 - 宾夕法尼亚'在df2['metro']
中匹配纽约'在df1['metro']
中(和与state
类似)。
Pandas合并功能不允许这种条件匹配。我怎样才能做到这一点?
答案 0 :(得分:0)
您需要做的第一件事就是清理(准备)您的数据:
def clean(df):
parts = [df[col].str.split('-', expand=True) for col in df.columns]
return pd.concat(parts, axis=1, keys=df.columns)
这会给你:
metro state
0 1 0
0 Santa Maria Santa Barbara California
1 New York None New York
2 Los Angeles None California
和
metro state
0 1 2 0 1 2
0 Los Angeles Long Beach Anaheim California None None
1 New York Newark Jersey City New York New Jersey Pennsylvania
2 Jefferson None None Georgia None None
现在你可能需要做更多的规范化,但是你必须弄清楚如何。例如,当你有New York-Newark-Jersey City
和New York-New Jersey-Pennsylvania
时,你不清楚......你可能需要将NYC映射到NYS,将Newark / JC映射到NJ,而不是PA。
到目前为止,您可以使用清理过的数据做一个示例:
df1a = clean(df1)
df2a = clean(df2)
df1a.metro[0].isin(df2a.metro[0])
这会给你[False, True, True]
。您可以重复每个DataFrame的metro部分中的每一列。
所以我意识到这不是你整个问题的完整解决方案,但希望它能让你走上正轨。清理数据,规范化数据,然后处理数据。