我正在将.ods电子表格转换为Pandas DataFrame。我有整列和行要删除,因为它们只包含“无”。由于“无”是str
,我有:
pandas.DataFrame.replace("None", numpy.nan)
...我打电话给他:.dropna(how='all')
是否pandas
等同于numpy.nan
?
有没有办法将.dropna()
与*字符串“无”而不是NaN
一起使用?
答案 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
使用replace
和dropna
将返回
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
)