【问题标题】:How to filter pandas rows based on if column values are substring of a given string?如何根据列值是否是给定字符串的子字符串来过滤熊猫行?
【发布时间】:2021-01-14 19:04:36
【问题描述】:
我有一个数据框 df,其中有一列 A。
有一个给定的字符串s。
我想用在A 中具有列值的行对数据框进行子集化,这些行是
给定字符串s。
如果我想反过来,我会做类似df[df['A'].contains(s)] 的事情。
但我想过滤掉s 是df['A'] 中值的超字符串的行。
我无法找到答案,因此如果存在重复问题,请提前道歉。
【问题讨论】:
标签:
python
pandas
string
dataframe
series
【解决方案1】:
我认为你不能比列表理解做得更好:
df[[x in s for x in df.A]]
但是,如果 df.A 是重复的(例如分类),那么您可以对其进行优化
key, unique_vals = pd.factorize(df.A)
mask = np.asarray([x in s for x in unique_vals])
df.loc[mask[key]]
或者如果df.A 是一个分类
key, unique_vals = df.A.cat.codes, df.A.cat.categories
mask = np.asarray([x in s for x in unique_vals])
df.loc[mask[key]]
【解决方案2】:
我创建了一个示例:
s = 'sas'
df = pd.DataFrame(data={'A':['s', 'a', 'sa', 'da']})
解决办法是:
filtered_df = df[[s.find(i)!=-1 for i in df['A'].values]]
这不是熊猫的方式,但它有效。我希望它会有所帮助。
输出:
A
0 s
1 a
2 sa
UPD:如果您不想在 s==i 处添加行,您可以修改此代码,如下所示:
df[[((s.find(i)!=-1) and (s!=i)) for i in df['A'].values]]