Pandas基于str.contains合并

时间:2017-09-09 01:07:50

标签: python pandas merge

我有两个数据帧如下:

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合并功能不允许这种条件匹配。我怎样才能做到这一点?

1 个答案:

答案 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 CityNew 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部分中的每一列。

所以我意识到这不是你整个问题的完整解决方案,但希望它能让你走上正轨。清理数据,规范化数据,然后处理数据。