在pandas数据帧中用NaN替换空列表

时间:2016-11-26 13:39:11

标签: python pandas

我正在尝试用NaN值替换数据中的一些空列表。但是如何在表达式中表示一个空列表?

import numpy as np
import pandas as pd
d = pd.DataFrame({'x' : [[1,2,3], [1,2], ["text"], []], 'y' : [1,2,3,4]})
d

    x           y
0   [1, 2, 3]   1
1   [1, 2]      2
2   [text]      3
3   []          4



d.loc[d['x'] == [],['x']] = d.loc[d['x'] == [],'x'].apply(lambda x: np.nan)
d

ValueError: Arrays were different lengths: 4 vs 0

而且,我希望[text]使用d[d['x'] == ["text"]]错误选择ValueError: Arrays were different lengths: 4 vs 1,但使用3选择d[d['y'] == 3]是正确的。为什么呢?

3 个答案:

答案 0 :(得分:9)

如果您希望将x列中的空列表替换为numpy nan,则可以执行以下操作:

d.x = d.x.apply(lambda y: np.nan if len(y)==0 else y)

如果要在等于['text']的行上对数据框进行子集化,请尝试以下操作:

d[[y==['text'] for y in d.x]]

我希望这会有所帮助。

答案 1 :(得分:1)

要回答您的主要问题,请完全忽略空列表。如果您使用pandas.concat而不是从字典构建数据框,那么如果一列中有值而另一列中没有值,NaN会自动填充。

>>> import pandas as pd
>>> ser1 = pd.Series([[1,2,3], [1,2], ["text"]], name='x')
>>> ser2 = pd.Series([1,2,3,4], name='y')
>>> result = pd.concat([ser1, ser2], axis=1)
>>> result
           x  y
0  [1, 2, 3]  1
1     [1, 2]  2
2     [text]  3
3        NaN  4

关于你的第二个问题,似乎你无法搜索元素内部。也许你应该把它作为一个单独的问题,因为它与你的主要问题没有关系。

答案 2 :(得分:1)

您可以使用“apply”函数来匹配指定的单元格值,无论它是字符串,列表等的实例。

例如,在您的情况下:

import pandas as pd
d = pd.DataFrame({'x' : [[1,2,3], [1,2], ["text"], []], 'y' : [1,2,3,4]})
d
    x           y
0   [1, 2, 3]   1
1   [1, 2]      2
2   [text]      3
3   []          4

如果您使用d == 3选择值为3的单元格,则完全可以:

      x       y
0   False   False
1   False   False
2   False   True
3   False   False

但是,如果您使用等号来匹配列表,则可能会超出您的例外情况,例如d == [text]d == ['text']d == '[text]',例如: enter image description here

有一些解决方案:

  1. 在数据框中的指定系列上使用函数apply(),就像顶部的答案一样:
  2. enter image description here

    1. 在Dataframe上使用函数applymap()的更通用方法可用于预处理步骤:

      d.applymap(lambda x:x == [])

        x       y
      

      0错误 1假错 2假错 3正确错误

    2. 希望它可以帮助您和以下学习者,如果您在applymap函数中添加类型检查会更好,否则可能会导致一些异常。