在Pandas中创建NaN值(而不是Numpy)

时间:2016-07-20 20:57:34

标签: python pandas

我正在将.ods电子表格转换为Pandas DataFrame。我有整列和行要删除,因为它们只包含“无”。由于“无”是str,我有:

pandas.DataFrame.replace("None", numpy.nan)

...我打电话给他:.dropna(how='all')

是否pandas等同于numpy.nan

有没有办法将.dropna()与*字符串“无”而不是NaN一起使用?

2 个答案:

答案 0 :(得分:2)

如果您真的想避免从numpy名称空间导入内容,可以使用float('nan')

>>> import pandas as pd
>>> s = pd.Series([1, 2, 3])
>>> s[1] = float('nan')
>>> s
0    1.0
1    NaN
2    3.0
dtype: float64
>>> 
>>> s.dropna()
0    1.0
2    3.0
dtype: float64

此外,如果您的字符串值为“无”,则可以.replace("None", float("nan"))

>>> s[1] = "None"
>>> s
0       1
1    None
2       3
dtype: object
>>> 
>>> s.replace("None", float("nan"))
0    1.0
1    NaN
2    3.0
dtype: float64

答案 1 :(得分:1)

如果您试图直接删除包含“无”字符串值的行(不将这些“无”单元格转换为NaN值),我想可以在不使用replace +的情况下完成dropna

考虑像DataFrame:

In [3]: df = pd.DataFrame({
            "foo": [1,2,3,4],
            "bar": ["None",5,5,6],
            "baz": [8, "None", 9, 10]
            })

In [4]: df
Out[4]: 
    bar   baz  foo
0  None     8    1
1     5  None    2
2     5     9    3
3     6    10    4

使用replacedropna将返回

In [5]: df.replace('None', float("nan")).dropna()
Out[5]: 
   bar   baz  foo
2  5.0   9.0    3
3  6.0  10.0    4

只需选择您需要的行即可获得:

In [7]: df[df.eval("foo != 'None' and bar != 'None' and baz != 'None'")]
Out[7]: 
  bar baz  foo
2   5   9    3
3   6  10    4

您还可以使用数据框的drop方法,正确选择目标轴/标签:

In [9]: df.drop(df[(df.baz == "None") |
                   (df.bar == "None") |
                   (df.foo == "None")].index)
Out[9]: 
  bar baz foo
2   5   9   3
3   6  10   4

这两种方法或多或少可以互换,例如你也可以这样做:
df[(df.baz != "None") & (df.bar != "None") & (df.foo != "None")]
(但我想比较df.somecolumns ==“有些字符串”只有在列类型允许的情况下才有可能,在最后2个示例之前,eval不是这种情况,我必须做{{ 1}} df = df.astype (object)列的类型为foo