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

4

我知道之前也有类似的问题被提出,但我已经尝试过这里列出的每一个可能的解决方法,但没有一个能够奏效。

我有一个包含日期、字符串、空值和空列表值的数据框,它非常巨大,有800万行。

我想要替换所有的空列表值——只有包含[]、没有其他内容的单元格——为NaN。但似乎没有任何方法能够奏效。

我尝试了以下方法:

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

如同在此问题中建议的一样(将空列表替换为NaN在pandas数据框中),但这对我的数据框没有产生任何影响。如有帮助,感激不尽。

我认为这可能不是你代码的问题。你可以检查一下列的实际数据类型。也许默认为“object”。 - Feishi
你的空列表是字符串 '[]' 还是真正的空列表? - piRSquared
2个回答

11

假设 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

谢谢,是的,我想把它们全部转换为 NaN。您有任何性能方面的建议吗?处理 800 万行数据很慢。是否可以改善? - SLack A

4
我假设您想要掩盖真正的空列表。
  • 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

这很好,它能够工作,但是@Allen是正确的,我需要将它们全部转换为NaN,因此我会标记他的答案。 - SLack A

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接