2014-10-28 57 views
12

我有一個數據框(在Python 2.7,熊貓0.15.0):Python的大熊貓應用功能,如果一個列值不爲空

df= 
     A B    C 
0 NaN 11    NaN 
1 two NaN ['foo', 'bar'] 
2 three 33    NaN 

我想申請一個簡單的函數,該函數不包含空行特定列中的值。我的作用是儘可能簡單:

def my_func(row): 
    print row 

我的申請代碼如下:

df[['A','B']].apply(lambda x: my_func(x) if(pd.notnull(x[0])) else x, axis = 1) 

它完美。如果我想檢查'B'列的空值,那麼pd.notnull()也可以很好地工作。但是,如果我選擇列「C」,其中包含列表對象:

df[['A','C']].apply(lambda x: my_func(x) if(pd.notnull(x[1])) else x, axis = 1) 

然後我收到以下錯誤信息:ValueError: ('The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()', u'occurred at index 1')

有誰知道爲什麼pd.notnull()僅適用於整數和字符串列,但不是名單列'?

,並有一個更好的方式在列「C」檢查NULL值,而不是這樣的:

df[['A','C']].apply(lambda x: my_func(x) if(str(x[1]) != 'nan') else x, axis = 1) 

謝謝!

回答

12

問題是pd.notnull(['foo', 'bar'])按元素運行並返回array([ True, True], dtype=bool)。你的if條件試圖將其轉換爲布爾值,那就是當你得到異常時。

爲了解決這個問題,你可以簡單地用np.all包裹ISNULL聲明:

df[['A','C']].apply(lambda x: my_func(x) if(np.all(pd.notnull(x[1]))) else x, axis = 1) 

現在你會看到np.all(pd.notnull(['foo', 'bar']))確實True

+0

注意,'np.all([真,真])'將返回TRUE;。我認爲這對OP是有效的。 – 2014-10-28 17:47:27

+0

@PaulH謝謝。我嘗試了'all'但忽略了'np.all'。問題不在於'[True,True]',而在於'False'。 'all(pd.notnull(None))'產生錯誤,'np.all(pd.notnull(None))'不會。 – Korem 2014-10-28 18:01:12

+0

謝謝韓國,它的工作原理!我想知道的是,一個'pd.notnull(df ['C'])'返回'False,True,False',而不是'False,[True,True],False'。 – ragesz 2014-10-29 09:33:30

4

另外一種方法是隻使用row.notnull().all()(不numpy),這裏有一個例子:

df.apply(lambda row: func1(row) if row.notnull().all() else func2(row), axis=1) 

這裏是你的DF一個完整的例子:

>>> d = {'A': [None, 2, 3, 4], 'B': [11, None, 33, 4], 'C': [None, ['a','b'], None, 4]} 
>>> df = pd.DataFrame(d) 
>>> df 
    A  B  C 
0 NaN 11.0 None 
1 2.0 NaN [a, b] 
2 3.0 33.0 None 
3 4.0 4.0  4 
>>> def func1(r): 
...  return 'No' 
... 
>>> def func2(r): 
...  return 'Yes' 
... 
>>> df.apply(lambda row: func1(row) if row.notnull().all() else func2(row), axis=1) 
0 Yes 
1 Yes 
2 Yes 
3  No 

而一個更友好的截圖: - )

enter image description here

0

我有一列包含列表和NaN s。所以,下一個爲我工作。

df.C.map(lambda x: my_func(x) if type(x) == list else x) 
+0

已經給出了更好的解決方案。 – 2017-11-22 10:54:23