2017-08-24 81 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

相關問題