Python Dataframe:根据使用列定义的条件进行筛选
我不熟悉使用熊猫数据帧,但我经常使用Spark的数据帧。考虑下面的数据文件。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
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