2017-08-24 140 views

回答

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

如果有可能像在C_YBA,C,D值,你不想匹配,那么你可以使用正则表达式作为论据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结尾

+0

我对那些正则表达式并不熟悉,所以你可能需要仔细检查它是否真的做了我认为应该做的事情。 – MSeifert

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柱。

+0

绝对值得考虑的一个边缘案例。但''应用''系列'是非常慢的...... – MSeifert

+0

是的,如果'C_Y'中的值已知为A-Z,则会更容易。 – Alexander

相关问题