替换pandas数据框中任意列的值

4
在下面的数据框中:
 T2MN   T2MX   RH2M DFP2M RAIN 
 6.96   9.32  84.27  5.57    - 
 6.31  10.46  -      5.63    - 
  -    10.66  79.38  3.63    - 
 0.79   4.45  94.24  1.85    - 
 1.45   3.99  91.71  1.17    - 

如何将所有的-替换为NaN。我不想指定列名,因为我事先不知道哪一列会有-


那看起来像是 NaN 的显示值。 - Mad Physicist
4个回答

5

只需使用replace()函数替换字符串:

In [10]: df.replace('-', 'NaN')
Out[10]: 
   T2MN   T2MX   RH2M  DFP2M RAIN
0  6.96   9.32  84.27   5.57  NaN
1  6.31  10.46    NaN   5.63  NaN
2   NaN  10.66  79.38   3.63  NaN
3  0.79   4.45  94.24   1.85  NaN
4  1.45   3.99  91.71   1.17  NaN

5
如果那些是字符串,那么你的浮点数很可能也是字符串。
假设你的数据框名为df,我建议尝试以下代码:
pd.to_numeric(df.stack(), 'coerce').unstack()

更深入的解释

Pandas通常不使用'-'来表示缺失的浮点数。因此,那个'-'必须是一个字符串。因此,任何包含'-'的列的dtype都必须是'object'。这使得很可能是将浮点数作为字符串解析的数据。

设置

from io import StringIO
import pandas as pd

txt = """T2MN   T2MX   RH2M DFP2M RAIN 
 6.96   9.32  84.27  5.57    - 
 6.31  10.46  -      5.63    - 
  -    10.66  79.38  3.63    - 
 0.79   4.45  94.24  1.85    - 
 1.45   3.99  91.71  1.17    - """

df = pd.read_csv(StringIO(txt), delim_whitespace=True)
print(df)

   T2MN   T2MX   RH2M  DFP2M RAIN
0  6.96   9.32  84.27   5.57    -
1  6.31  10.46      -   5.63    -
2     -  10.66  79.38   3.63    -
3  0.79   4.45  94.24   1.85    -
4  1.45   3.99  91.71   1.17    -

dtypes是什么?

print(df.dtypes)

T2MN      object
T2MX     float64
RH2M      object
DFP2M    float64
RAIN      object
dtype: object

第一个元素的类型是什么?
print(type(df.iloc[0, 0]))

<class 'str'>

这意味着任何带有'-'的列都像一个看起来像浮点数的字符串列。你需要使用pd.to_numeric并设置参数errors='coerce',强制非数字项变成np.nan。然而,pd.to_numeric不能在pd.DataFrame上操作,所以我们需要使用stackunstack
pd.to_numeric(df.stack(), 'coerce').unstack()

   T2MN   T2MX   RH2M  DFP2M  RAIN
0  6.96   9.32  84.27   5.57   NaN
1  6.31  10.46    NaN   5.63   NaN
2   NaN  10.66  79.38   3.63   NaN
3  0.79   4.45  94.24   1.85   NaN
4  1.45   3.99  91.71   1.17   NaN

2
我认为你需要实际的 `numpy.nan` 而不是字符串 `NaN`,因为你可以在 `pandas.Series`/`pandas.DataFrame` 上使用许多方法,如 `fillna`/`isnull`/`notnull`。
import pandas as pd

import numpy as np

df = pd.DataFrame([['-']*10]*10)

df = df.replace('-',np.nan)

1

看起来你正在从CSV/FWF文件中读取这些数据... 如果是真的,最简单的方法是告诉Pandas将'-'解释为NaN

df = pd.read_csv(filename, na_values=['NaN', 'nan', '-'])

测试:

In [79]: df
Out[79]:
   T2MN   T2MX   RH2M  DFP2M  RAIN
0  6.96   9.32  84.27   5.57   NaN
1  6.31  10.46    NaN   5.63   NaN
2   NaN  10.66  79.38   3.63   NaN
3  0.79   4.45  94.24   1.85   NaN
4  1.45   3.99  91.71   1.17   NaN

In [80]: df.dtypes
Out[80]:
T2MN     float64
T2MX     float64
RH2M     float64
DFP2M    float64
RAIN     float64
dtype: object

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