2015-12-10 33 views

回答

2

例如說你想放棄,在一列

In [5]: import pandas as pd 
In [7]: data = [['a', 'b'], ['a', 'c'], ['c', 'd']] 
     df = pd.DataFrame(data, columns=['col1', 'col2']) 

In [9]: df 
Out[9]: 
    col1 col2 
0 a b 
1 a c 
2 c d 

In [10]: df.loc[~(df == 'c').sum(axis=1).astype(bool)] 
Out[10]: 
    col1 col2 
0 a b 

這個問題比較不同的解決方案有「c」的任何行。我首先創建一個大型測試數據集:

In [11]: data = [['a', 'b'], ['a', 'c'], ['c', 'd']]*10000 
     df = pd.DataFrame(data, columns=['col1', 'col2']) 

這裏是一個更新的解決方案,我認爲最好到目前爲止:

In [6]: %timeit df.loc[~(df == 'c').any(axis=1)] 
100 loops, best of 3: 3.85 ms per loop 

這是我原來的解決方案:

In [13]: %timeit df.loc[~(df == 'c').sum(axis=1).astype(bool)] 
100 loops, best of 3: 3.92 ms per loop 

這裏是從其他解決方案的比較:

In [14]: %timeit df[df.applymap(lambda x: False if 'c' in str(x) else True)].dropna() 
10 loops, best of 3: 43 ms per loop 

In [5]: %timeit df[~df.apply(lambda series: series.str.contains('c')).any(axis=1)] 
10 loops, best of 3: 60.7 ms per loop 

雖然原來的問題比較簡單,但它也說明lambda可能非常慢。多次調用函數的開銷很大,例如數據框中有很多行。處理大型數據幀時避免使用它們通常是值得的。

+0

謝謝,我正在審查和標記你的答案正確,我忘記了早些時候。再次感謝。 –

0

假設您在df中沒有其他NA值,這將工作代「刪除」與「收入」

df[df.applymap(lambda x: False if 'DELETE' in str(x) else True)].dropna() 
0

您可以使用apply和lambda表達式來檢查每列中的目標詞。然後使用any(axis=1)找到包含該單詞的任何行。最後,使用帶有tilda的布爾索引(~)來查找收入不在該行中的所有行。

df = pd.DataFrame({'A': ['a', 'income', 'c'], 'B': ['a', 'b', 'income'], 'C': ['a', 'b', 'c']}) 

>>> df 
     A  B C 
0  a  a a 
1 income  b b 
2  c income c 

# A check for which cells contain the target word. 
>>> df.apply(lambda series: series.str.contains('income')) 
     A  B  C 
0 False False False 
1 True False False 
2 False True False 

# Remove the offending rows. 
>>> df[~df.apply(lambda series: series.str.contains('income')).any(axis=1)] 
    A B C 
0 a a a 
相關問題