将特定字符串转换为pandas中的数值

时间:2017-08-12 17:39:41

标签: python pandas

我正在尝试对一些降雨数据进行数据分析。数据示例如下所示: -

10   18/05/2016   26.9     40    20.8     34   52.2    20.8   46.5     45   
11   19/05/2016   25.5     32     0.3   41.6     42     0.3   56.3   65.2   
12   20/05/2016    8.5     29    18.4      9     36    18.4   28.6     46   
13   21/05/2016   24.5     18   TRACE    3.5     17   TRACE    4.4     40   
14   22/05/2016    0.6     18       0    6.5     14       0    8.6     20   
15   23/05/2016    3.5      9     0.6    4.3     14     0.6      7     15   
16   24/05/2016    3.6     25       T      3     12       T   14.9      9   
17   25/05/2016     25     21     2.2   25.6     50     2.2     25      9   

降雨量数据包含特定字符串' TRACE '或者' T ' (均表示不可测量的降雨量)。为了进行分析,我想将这些字符串转换为' 1.0' (浮动)。我想要的数据应如下所示,以便将值绘制为线图: -

10   18/05/2016   26.9     40    20.8     34   52.2    20.8   46.5     45   
11   19/05/2016   25.5     32     0.3   41.6     42     0.3   56.3   65.2   
12   20/05/2016    8.5     29    18.4      9     36    18.4   28.6     46   
13   21/05/2016   24.5     18     1.0    3.5     17     1.0    4.4     40   
14   22/05/2016    0.6     18       0    6.5     14       0    8.6     20   
15   23/05/2016    3.5      9     0.6    4.3     14     0.6      7     15   
16   24/05/2016    3.6     25     1.0      3     12     1.0   14.9      9   
17   25/05/2016     25     21     2.2   25.6     50     2.2     25      9   

有人可以指出我正确的方向吗?

3 个答案:

答案 0 :(得分:3)

您可以使用df.replace,然后使用float将数字转换为df.astype(原始数据类型为object,因此对这些列的任何操作仍会受到影响来自绩效问题):

df = df.replace('^T(RACE)?$', 1.0, regex=True)
df.iloc[:, 1:] = df.iloc[:, 1:].astype(float) # converting object columns to floats 

这会将所有TTRACE元素替换为1.0。

输出:

10  18/05/2016  26.9  40  20.8  34.0  52.2  20.8  46.5  45.0
11  19/05/2016  25.5  32   0.3  41.6  42.0   0.3  56.3  65.2
12  20/05/2016   8.5  29  18.4   9.0  36.0  18.4  28.6  46.0
13  21/05/2016  24.5  18     1   3.5  17.0     1   4.4  40.0
14  22/05/2016   0.6  18     0   6.5  14.0     0   8.6  20.0
15  23/05/2016   3.5   9   0.6   4.3  14.0   0.6   7.0  15.0
16  24/05/2016   3.6  25     1   3.0  12.0     1  14.9   9.0
17  25/05/2016  25.0  21   2.2  25.6  50.0   2.2  25.0   9.0

答案 1 :(得分:2)

dict使用replace

df = df.replace({'T':1.0, 'TRACE':1.0})

然后在必要时将列转换为float

cols = df.columns.difference(['Date','another cols dont need convert'])
df[cols] = df[cols].astype(float)
df = df.replace({'T':1.0, 'TRACE':1.0})
cols = df.columns.difference(['Date','a'])
df[cols] = df[cols].astype(float)
print (df)
    a        Date     2     3     4     5     6     7     8     9
0  10  18/05/2016  26.9  40.0  20.8  34.0  52.2  20.8  46.5  45.0
1  11  19/05/2016  25.5  32.0   0.3  41.6  42.0   0.3  56.3  65.2
2  12  20/05/2016   8.5  29.0  18.4   9.0  36.0  18.4  28.6  46.0
3  13  21/05/2016  24.5  18.0   1.0   3.5  17.0   1.0   4.4  40.0
4  14  22/05/2016   0.6  18.0   0.0   6.5  14.0   0.0   8.6  20.0
5  15  23/05/2016   3.5   9.0   0.6   4.3  14.0   0.6   7.0  15.0
6  16  24/05/2016   3.6  25.0   1.0   3.0  12.0   1.0  14.9   9.0
7  17  25/05/2016  25.0  21.0   2.2  25.6  50.0   2.2  25.0   9.0

print (df.dtypes)
a         int64
Date     object
2       float64
3       float64
4       float64
5       float64
6       float64
7       float64
8       float64
9       float64
dtype: object

答案 2 :(得分:0)

从@jezrael扩展答案,您可以在单个语句中替换并转换为浮点数(假设第一列为Date,其余为所需的数字列):

df.iloc[:, 1:] = df.iloc[:, 1:].replace({'T':1.0, 'TRACE':1.0}).astype(float)