在下面的数据框中:

 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 替换所有 -。我不想指定列名,因为我事先不知道哪个列会有 -

最佳答案

如果这些是字符串,那么您的浮点数可能也是字符串。

假设您的数据框是 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

关于python - 替换 Pandas 数据框中任何列中的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42172204/

10-11 01:20
查看更多