用NaN替换Pandas DataFrame中的空列表值

时间:2017-05-04 17:02:02

标签: python-3.x 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中同样建议,但它并没有改变我的数据框中的任何内容。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:3)

假设OP想要将空列表,字符串'[]'和对象'[]'转换为na,下面是一个解决方案。

<强>设置

onRowExpand(cc){
    console.log(cc)
    //logs the entire object which is clicked     
  }

<强>解决方案:

#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

答案 1 :(得分:2)

我将假设您要屏蔽实际的空列表。

  • pd.DataFrame.mask会将具有相应True值的单元格转换为np.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