我有这个Dataframe:
C_M C_N C_Y
0 100 A A
1 200 C A,D
2 300 B A,C,E
3 400 A B,C,A
4 500 A A,D,E
我如何才能保留列C_N
和列C_Y
所包含的行" A" s?
这将是理想的结果:
C_M C_N C_Y
0 100 A A
1 400 A B,C,A
2 500 A A,D,E
答案 0 :(得分:1)
您可以使用布尔屏蔽,然后重置索引
# assuming your original DataFrame is named `df`
>>> df = df[(df.C_N == 'A') & (df.C_Y.str.contains('A'))].reset_index(drop=True)
>>> df
C_M C_N C_Y
0 100 A A
1 400 A B,C,A
2 500 A A,D,E
如果BA,C,D
中有C_Y
之类的值您不想匹配,那么您可以使用正则表达式作为str.contains
的参数:
df[(df.C_N == 'A') & (df.C_Y.str.contains(r'(?:^A$)|(?:^A,)|(?:,A,)|(?:,+A$)'].reset_index(drop=True)
正则表达式检查它是否仅包含A
(没有其他内容)或以A,
开头或以,A,
开头或以,A
结尾
答案 1 :(得分:1)
为了说明列C_Y
可以包含复合字母(例如'BA')的情况,此解决方案会拆分该列,并确保将值A
作为列表中的唯一元素包含在内:
>>> df.loc[(df['C_N'] == 'A') & (df['C_Y'].str.split(',').apply(lambda row: 'A' in row))]
C_M C_N C_Y
0 100 A A
3 400 A B,C,A
4 500 A A,D,E
根据样本数据,它假定列C_Y
中没有间距。
答案 2 :(得分:0)
这是一种方式
In [1312]: df[(df.C_N == 'A') & (df.C_Y.str.contains('A'))]
Out[1312]:
C_M C_N C_Y
0 100 A A
3 400 A B,C,A
4 500 A A,D,E
另一个
In [1317]: df[df[['C_N', 'C_Y']].apply(lambda x: x.str.contains('A')).all(1)]
Out[1317]:
C_M C_N C_Y
0 100 A A
3 400 A B,C,A
4 500 A A,D,E