我有两个数据框,如下所示:
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']
中的“New York-New Jersey-Pennsylvania”与 df1['metro']
中的“New York”匹配(和 与 state
类似)。
Pandas 合并函数不允许这种条件匹配。我怎样才能实现这个目标?
最佳答案
您需要做的第一件事是清理(准备)您的数据:
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 部分中的每一列进行重复操作。
所以我意识到这并不能完全解决您的整个问题,但希望它能让您走上正确的道路。清理数据,标准化数据,然后处理数据。
关于python - Pandas 基于 str.contains 合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46126265/