3 回答
TA贡献1877条经验 获得超1个赞
您可以使用
>>> type_a = df['Type C1'].apply(pd.Series).eq('Type A').any(1)
>>> df[df['BTP'].eq(42) & type_a]
A B C-1 D BTP Type C1 Type C2
3 0 4 3 3 42 [Type A, Type B] [Type A, Type B]
TA贡献1725条经验 获得超7个赞
使用,Series.str.join
连接列中的列表Type C1
,然后我们可以Series.str.contains
在此列上使用来检查给定的字符串 ieType A
是否存在于系列中,最后我们可以使用布尔值过滤数据帧的行mask
:
mask = df['BTP'].eq(42) & df['Type C1'].str.join('-').str.contains(r'\bType A\b')
df = df[mask]
结果:
# print(df)
A B C-1 D BTP Type C1 Type C2
3 0 4 3 3 42 [Type A, Type B] [Type A, Type B]
TA贡献1859条经验 获得超6个赞
我使用自定义函数解决了这个问题,根据所考虑的列表是否包含“类型 A”,为每一行返回真/假值列表。
# Check if elem is present in column 'col'
def has_elem(col, elem):
result = []
for c in col:
if elem in c:
result.append(True)
else:
result.append(False)
return result
# Filter
df.loc[(df['BTP'] == 42) & has_elem(df['Type_C1'], 'Type A'), :]
您的代码不起作用的原因是因为第二个过滤器子句在 Series 对象中'Type A' in df['Type_C1']查找字符串的成员资格,并因此返回。相反,您需要返回一系列 True/False 值,数据框中的每一行 1。'Type A'df['Type_C1']False
添加回答
举报