Python Dataframe:根据使用列定义的条件进行筛选

Python Dataframe:根据使用列定义的条件进行筛选,python,pandas,dataframe,filter,Python,Pandas,Dataframe,Filter,我不熟悉使用熊猫数据帧,但我经常使用Spark的数据帧。考虑下面的数据文件。 Name Value Title mickey 20 wonderland donald 10 welcome to donald's castle minnie 86 Minnie mouse clubhouse 我只想保留那些“Name”包含在“Title”大小写中的行。因此,在本例中,过滤后的数据帧应该如下所示 Name Value Title donald 10

我不熟悉使用熊猫数据帧,但我经常使用Spark的数据帧。考虑下面的数据文件。

Name   Value   Title
mickey 20      wonderland
donald 10      welcome to donald's castle
minnie 86      Minnie mouse clubhouse
我只想保留那些“Name”包含在“Title”大小写中的行。因此,在本例中,过滤后的数据帧应该如下所示

Name   Value   Title
donald 10      welcome to donald's castle
minnie 86      Minnie mouse clubhouse
已删除名为mickey的行

在spark中,我可以创建一个数据帧
df
,然后说
df.filter($'Title'.lower().contains($'Name'.lower())


有没有一种简单的方法可以在Pandas数据帧中表达这一点?

Pandas中的字符串方法本质上很难矢量化。我通常使用列表理解来完成此操作:

df[[y.lower() in x.lower() for x, y in zip(df['Title'], df['Name'])]]

     Name  Value                       Title
1  donald     10  welcome to donald's castle
2  minnie     86      Minnie mouse clubhouse
大多数字符串方法都可以通过使用列表理解来加快速度。如果您不担心NAN和混合类型,那么就需要较长的时间。看


如果需要错误处理,请使用带有
try except
处理的函数。这个速度更快


使用
numpy.core.chararray

s1=df.Title.str.upper().values.astype(str)
s2=df.Name.str.upper().values.astype(str)
df[np.core.chararray.find(s1,s2)!=-1]
Out[790]: 
     Name  Value                       Title
1  donald     10  welcome to donald's castle
2  minnie     86      Minnie mouse clubhouse

这是另一个解决方案,但它使用了
.apply
方法,不确定这在速度方面是否适用,但这是可行的,并且非常易于表达

df[df.apply(lambda x: x.Name.upper() in x.Title.upper(), axis=1) == True]


# Output
    Name    Value Title
1   donald  10    welcome to donald's castle
2   minnie  86    Minnie mouse clubhouse

这里还有几个选项,都是基于(主要要求是使用
“|”。.join(…)

备选案文1-

-使用


哇!熊猫在表达能力方面受到严重限制。来自星火世界的熊猫,操纵看起来几乎丑陋。谢谢你的解决方案。看起来不错。将接受解决方案。@Nik pandas不是‘丑’:-),我们只需要遵循它背后的正确逻辑
df[df.apply(lambda x: x.Name.upper() in x.Title.upper(), axis=1) == True]


# Output
    Name    Value Title
1   donald  10    welcome to donald's castle
2   minnie  86    Minnie mouse clubhouse
df_match = df.query("Title.str.lower().str.contains('|'.join(Name.str.lower()))")
print(df_match)
     Name  Value                       Title
1  donald     10  welcome to donald's castle
2  minnie     86      Minnie mouse clubhouse
print(df[df['Title'].str.lower().str.contains('|'.join(df['Name'].str.lower()))])
     Name  Value                       Title
1  donald     10  welcome to donald's castle
2  minnie     86      Minnie mouse clubhouse
from numpy import where
df['match'] = (
                where(df.Title.str.lower().str.contains(
                    '|'.join(df['Name'].str.lower()))
                , True, False)
                )
print(df[df['match']==True])
     Name  Value                       Title  match
1  donald     10  welcome to donald's castle   True
2  minnie     86      Minnie mouse clubhouse   True