【问题标题】:Join two data frames by searching & matching exactly same strings通过搜索和匹配完全相同的字符串来连接两个数据框
【发布时间】:2022-01-05 18:45:38
【问题描述】:

我有两个 python 数据框: 其中一个有一列有一行'AC-2' 另一个数据框包括具有字符串行'AC-20,AC8,AC-15'的列

str_match = "({})".format("|".join(df1['column_first_dataframe']))
df2.merge(df2,how='left',left_on=df1['column_first_dataframe'].str.extract(str_match)[0], right_on="column_second_dataframe")

第一个数据集:

Column1 Column2
AC-2         2       
AC-20        1       
AC-15        3       
AC-1         2       
AC-5         5      
     

第二个数据集:

Column1        
AC-2,AC-5,AC-30      
AC-20,AC-30,AC11

我找到了:

Column1 Column2             
AC-2       AC-20,AC-30,AC11       
AC-2       AC-2,AC-5,AC-30   
AC-20      AC-20,AC-30,AC11        
AC-15        null      
AC-1         null      
AC-5        AC-2,AC-5,AC-30 

上面有数据集 1 的 AC-2 和数据集 2 的字符串中的 AC-20 之间的匹配,但它们在我的数据集中是不同的东西。 我想要的输出:

Column1 Column2             
AC-2       AC-2,AC-5,AC-30      
AC-20      AC-20,AC-30,AC11        
AC-15        null      
AC-1         null      
AC-5       AC-2,AC-5,AC-30

我尝试通过搜索和匹配来合并数据帧,但我的代码将 AC-2 合并到 AC-20。我不想那样做。 是否有任何搜索和匹配方式可以完全合并我想要的数据框。我不想合并 AC-20 和 AC-2。它应该将 AC-2 和 AC-2 合并为完全相同的东西。

感谢您的贡献!

【问题讨论】:

  • 最好是提供输入/输出的最小示例
  • 您的 DataFrame 样本在这里会很有帮助。您可以将df.head(10).to_dict() 的文字发布到您的问题中吗?
  • 我不确定我是否完全理解您的问题,但您可以尝试在开头添加 '^' 并在 str_match 末尾添加 '$' 以仅匹配完整字符串。
  • 谢谢你们,我在我的问题中添加了一个例子
  • 总是只有一个匹配项吗?如果你在第一个数据框中有 AC-30 会发生什么?

标签: python pandas dataframe merge string-matching


【解决方案1】:

一个简单的方法是splitexplode df2 的Column2 每full word 得到一行,然后执行一个简单的左merge

(df1
 .merge(df2.assign(group=df2['Column1'].str.split(','))
           .rename(columns={'Column1': 'Column3'})
           .explode('group'),
        left_on='Column1', right_on='group', how='left'
       )
 .drop(columns='group')
)

输出:

  Column1  Column2           Column3
0    AC-2        2   AC-2,AC-5,AC-30
1   AC-20        1  AC-20,AC-30,AC11
2   AC-15        3               NaN
3    AC-1        2               NaN
4    AC-5        5   AC-2,AC-5,AC-30
替代

注意。我正在生成稍微不同的输出以保留所有列。如果您真的想要输出,只需将“Column2”放入 df1 并将“Column1”重命名为 df2 中的“Column2”

(df1
 .drop(columns='Column2')
 .merge(df2.rename(columns={'Column1': 'Column2'})
           .assign(Column1=df2['Column1'].str.split(','))
           .explode('Column1'),
        on='Column1', how='left'
       )
)

输出:

  Column1           Column2
0    AC-2   AC-2,AC-5,AC-30
1   AC-20  AC-20,AC-30,AC11
2   AC-15               NaN
3    AC-1               NaN
4    AC-5   AC-2,AC-5,AC-30

【讨论】:

  • 成功了,谢谢!
猜你喜欢
  • 2017-01-28
  • 1970-01-01
  • 1970-01-01
  • 2012-09-28
  • 2021-11-06
  • 1970-01-01
  • 2021-07-07
  • 2021-09-10
  • 2012-12-01
相关资源
最近更新 更多