2017-05-04 21 views
0

これまで同様の質問があったことは知っていますが、私は文字通りここにリストされているすべての解決策を試してみましたが、Pandas DataFrameの空のリストの値をNaNに置き換えます

私は日付、文字列、空の値、および空のリストの値で構成されるデータフレームを持っています。それは非常に巨大で、800万行です。

すべての空のリスト値を置き換えたいので、[]のみを含むセル、NaN以外のものは置き換えないでください。何も動作していないようです。この質問replace empty list with NaN in pandas dataframeにおいても同様に助言として

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

が、それは私のデータフレームには何も変わりません:

は、私はこれを試してみました。

ご協力いただければ幸いです。

+0

私は多分それはあなたのコードの問題ではないと思います。列の実際のデータ型をチェックすることができます。おそらく 'オブジェクト'のデフォルトです。 – 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は、私が実際list値を見つけたいnp.nan
    • True値に対応した細胞を向けるだろう。だから私はすべての細胞タイプを取得し、私が[]がブール値のコンテキストでFalseと評価されたので、私が見てdf.astype(bool)を使用しますことを知っているlist
    • に等しいかどうかを確認するためにdf.applymap(type)を使用します。私は両方の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に変換する必要がありますので、私は彼の答えに印をつけます。 –

    関連する問題