2016-12-31 28 views
2

我如何才能找到值AAA的順序,列之間BBBCOL_1COL_2COL_3,...,COL_X(其中X一些號碼,例如200,那麼枚舉是不是一個很好的解決方案)?如何使用給定的值序列爲2個後續列提取行?

例如,如果有一個數據幀df,則行1和4應該是輸出:

df= 
ID COL_1 COL_2 COL_3 COL_4 
1  AAA  BBB  CCC  DDD 
2  DDD  AAA  CCC  BBB 
3  BBB  AAA  DDD  CCC 
4  CCC  AAA  BBB  DDD 

回答

3

您可以加入行的相關列的字符串,然後搜索AAA,BBB模式。

def func(x): 
    return any(x1 == 'AAA' and x2 == 'BBB' for x1, x2 in 
       zip(x.slice_shift(1), x.slice_shift(-1))) 

print(df[df.apply(func, axis=1)]) 

對於這個數據幀:

In [152]: df.filter(regex='COL_').apply(lambda x: 'AAA,BBB' in ','.join(x), axis=1) 
Out[152]: 
0  True 
1 False 
2 False 
3  True 
dtype: bool 

如果數值,例如用map

In [166]: df.apply(lambda x: 'AAA,BBB' in ','.join(map(str, x)), axis=1) 
Out[166]: 
0  True 
1 False 
2 False 
3  True 
dtype: bool 

In [175]: df[df.apply(lambda x: 'AAA,BBB' in ','.join(map(str, x)), axis=1)] 
Out[175]: 
    ID COL_1 COL_2 COL_3 COL_4 
0 1 AAA BBB CCC DDD 
3 4 CCC AAA BBB DD 
+0

謝謝。你能解釋一下如何獲取行,而不是「真」或「假」嗎? – Dinosaurius

+0

另外,我得到一個錯誤'TypeError:('sequence item 0:expected string,numpy.int64 found',u'occurred at inde' – Dinosaurius

+0

您確定,您正在處理相同的樣本數據嗎?所有'COL_'列預計會是字符串 – Zero

2

你可以通過移動一位,並拉上在對所有列將它們轉換爲字符串:

COL_1 COL_2 COL_3 COL_4 COL_5 
ID        
1 AAA BBB CCC DDD  10 
2 DDD AAA CCC BBB  20 
3 BBB AAA DDD CCC  30 
4 CCC AAA BBB DDD  40 

輸出看起來是這樣的:

COL_1 COL_2 COL_3 COL_4 COL_5 
ID        
1 AAA BBB CCC DDD  10 
4 CCC AAA BBB DDD  40 

x.slice_shift(1)相當於x[1:]但不復制數據。

相關問題