python - 如果 pandas 系列中的字符串包含来自另一个 pandas 数据帧的字符串

标签 python pandas

苦苦挣扎的新手。 如果我有两个 pandas 数据框,例如:

    import pandas as pd
    data = {'col1': ['black sphynx bob','brown labrador','grey labrador mervin',
            'brown siamese cat','white siamese']}
    desc_df = pd.DataFrame(data=data)

    catg = {'dog': ['labrador','rottweiler',
            'beagle'],'cat':['siamese','sphynx','ragdoll']}

    catg_df = pd.DataFrame(data=catg)

    desc_df
               col1
    0      black spyhnx bob
    1        brown labrador
    2  grey labrador mervin
    3     brown siamese cat
    4         white Siamese

   catg_df
         cat         dog
   0  siamese    labrador
   1   sphynx  rottweiler
   2  ragdoll      beagle

我想最终得到 desc_df 数据框:

           col1             col2
0      black spyhnx bob     cat
1        brown Labrador     dog
2  grey labrador Mervin     dog
3     brown siamese cat     cat 
4         white Siamese     cat

我想我也许可以将 apply 方法与函数一起使用。我只是不 100% 有信心这是否是解决此问题的最佳方法以及具体如何完成。 非常感谢

最佳答案

您可以使用str.contains + np.where

desc_df['col2']=np.where(desc_df.col1.str.contains(catg_df.cat.str.cat(sep='|')),'cat','dog')
desc_df
Out[1538]: 
                   col1 col2
0      black spyhnx bob  dog
1        brown labrador  dog
2  grey labrador mervin  dog
3     brown siamese cat  cat
4         white siamese  cat

确定更新多个条件

d=catg_df.apply('|'.join).to_dict()
desc_df.col1.apply(lambda x : ''.join([z if pd.Series(x).str.contains(y).values else '' for z,y in d.items()]))
Out[1568]: 
0       
1    dog
2    dog
3    cat
4    cat
Name: col1, dtype: object

关于python - 如果 pandas 系列中的字符串包含来自另一个 pandas 数据帧的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49696700/

相关文章:

python - 以给定角度在矩形上查找点

Python:如何在使用 os 重命名文件时保留文件扩展名?

python - 有没有办法在 Pandas 中自定义清理一行?

python - 使用 python pandas 或任何其他更好的库在工作表中添加一列并在整列中应用此 excel 公式

python - 如何注释箱线图的中位数、四分位数和须线

python - 代码与前面的行相同,但给出了错误?

python - 关于 tkinter 按钮的基本问题

python - 如何在 ListView 中设置选择?

python - Pandas:列名包含特殊字符的查询字符串

python - 在多个条件下从数据框中过滤行,获取 ValueError