2017-02-11 93 views
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 - 

如何与南的更换所有的-。我不想指定列名,因为我不知道列手这之前将有-

+0

这看起来像是男的显示值 –

回答

5

如果这些都是字符串,那么你的花车也可能字符串。

假设你的数据帧是df,我想尝试

pd.to_numeric(df.stack(), 'coerce').unstack() 

再阐释

大熊猫通常不与'-'表示丢失的浮动。因此,该'-'必须是一个字符串。因此,其中'-'的任何列的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 
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 
2

我想你想的实际numpy.nan而不是一个字符串NaN的,你可以用很多方法,如在pandas.Series/pandas.DataFrame

import pandas as pd 

import numpy as np 

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

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

看起来你fillna/isnull/notnull正在从CSV/FWF文件中读取这些数据......如果这是真的,摆脱'-'的最简单方法是解释熊猫,它是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