python - Pandas 基于 str.contains 合并

标签 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'] 中的“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 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 部分中的每一列进行重复操作。

所以我意识到这并不能完全解决您的整个问题,但希望它能让您走上正确的道路。清理数据,标准化数据,然后处理数据。

关于python - Pandas 基于 str.contains 合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46126265/

相关文章:

python - 如何使用 matplotlib 在 Python 中填充多边形内的区域?

python - 如何将零向量添加到 Pandas DataFrame?

r - 双重合并r中的两个数据帧

android - Android Gradle项目可以合并库xml资源

python - Pandas 将每个数据集行乘以多个向量

javascript - 如何使用 jsPDF 合并两个 PDF 文件

python - 调用打印功能,避免换行

python - 打印 pyparsing 结果树

python - Django:如何在佛罗里达设置中设置 EDT 时区

python - 如何按 MultiIndex 和按值对 Pandas DataFrame 进行排序?