如何删除此DataFrame中不包含A的所有行?

时间:2017-08-24 06:34:14

标签: python pandas dataframe

我有这个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

3 个答案:

答案 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