2017-05-04 86 views
0

我知道之前有類似的問題,但我試着嘗試了這裏列出的所有可能的解決方案,但都沒有工作。用NaN替換Pandas DataFrame中的空列表值

我有一個數據幀,它由日期,字符串,空值和空列表值組成。這是非常巨大的,800萬行。

我想要替換所有的空列表值 - 所以只有只包含[]的單元格,沒有別的與NaN。似乎沒有任何工作。

我嘗試這樣做:

df = df.apply(lambda y: np.nan if (type(y) == list and len(y) == 0) else y) 

在這個問題replace empty list with NaN in pandas dataframe類似建議,但它並不在我的數據幀進行任何更改。

任何幫助,將不勝感激。

+0

我想,也許這不是你的代碼的問題。您可以檢查列的真實數據類型。也許它默認爲'object'。 – Feishi

+0

你是空列表字符串''[]''還是實際的空列表? – piRSquared

回答

0

剛假設OP想要將空列表,字符串'[]'和對象'[]'轉換爲na,下面是一個解決方案。

設置

#borrowed from piRSquared's answer. 
df = pd.DataFrame([ 
     [1, 'hello', np.nan, None, 3.14], 
     ['2017-06-30', 2, 'a', 'b', []], 
     [pd.to_datetime('2016-08-14'), 'x', '[]', 'z', 'w'] 
    ]) 

df 
Out[1062]: 
        0  1 2  3  4 
0     1 hello NaN None 3.14 
1   2017-06-30  2 a  b [] 
2 2016-08-14 00:00:00  x []  z  w 

解決方案:

#convert all elements to string first, and then compare with '[]'. Finally use mask function to mark '[]' as na 
df.mask(df.applymap(str).eq('[]')) 
Out[1063]: 
        0  1 2  3  4 
0     1 hello NaN None 3.14 
1   2017-06-30  2 a  b NaN 
2 2016-08-14 00:00:00  x NaN  z  w 
+0

謝謝,是的,我想將它們全部轉換爲NaN。你有任何性能建議嗎?這是800萬行緩慢。可以改進嗎? –

2

我打算假設你想掩蓋實際的空列表。

  • pd.DataFrame.mask會變成具有相應Truenp.nan
  • 我想找到實際list值的單元格。所以,我會用df.applymap(type)獲得在每一個細胞類型,看看它是否等於list
  • 我知道[]計算結果爲False在布爾上下文,所以我會用df.astype(bool)看到的。
  • 我最終會掩蓋那些既list型細胞和評價False

考慮數據框df

df = pd.DataFrame([ 
     [1, 'hello', np.nan, None, 3.14], 
     ['2017-06-30', 2, 'a', 'b', []], 
     [pd.to_datetime('2016-08-14'), 'x', '[]', 'z', 'w'] 
    ]) 

df 

        0  1 2  3  4 
0     1 hello NaN None 3.14 
1   2017-06-30  2 a  b [] 
2 2016-08-14 00:00:00  x []  z  w 

解決方案

df.mask(df.applymap(type).eq(list) & ~df.astype(bool)) 

        0  1 2  3  4 
0     1 hello NaN None 3.14 
1   2017-06-30  2 a  b NaN 
2 2016-08-14 00:00:00  x []  z  w 
+0

這很好,它有效,但@Allen是正確的,我需要將它們全部轉換成NaN,所以我會標記他的答案。 –

相關問題