Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如果pandas系列中的字符串包含来自另一个pandas数据帧的字符串_Python_Pandas - Fatal编程技术网

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

Python 如果pandas系列中的字符串包含来自另一个pandas数据帧的字符串,python,pandas,Python,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','r

挣扎的新手。 如果我有两个熊猫数据帧,比如:

    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

一种方法是创建一个将动物映射到类型的字典

然后使用
pd.Series.apply
next
以及生成器表达式:

d = {i: k for k in catg_df for i in catg_df[k].unique()}

desc_df['col2'] = desc_df['col1'].apply(lambda x: next((d.get(i) for i in x.split() \
                                                        if i in d), None))

print(desc_df)

#                    col1 col2
# 0      black sphynx bob  cat
# 1        brown labrador  dog
# 2  grey labrador mervin  dog
# 3     brown siamese cat  cat
# 4         white siamese  cat

斯芬克斯是一只狗:)谢谢,这看起来很接近,因为某种原因,syphnx将成为一只狗。我会尽力理解你所做的一切。此外,这是我试图实现的目标的一个非常简单的例子,如果它可以使用非常棒的列标题的话,我还有一些类别,而不仅仅是猫和狗。@c您的示例拼写错误,对吗?syphnx或spyhnx@CGully,如果您有任意数量的列,例如cat/dog/fish/bird/等,请查看我的解决方案。但我相信温家宝也能想出一个通用的熊猫解决方案。谢谢,这两篇专栏文章很有用。如果我有6个专栏,这看起来很困难。我来看看@jpp solutions。谢谢