我有这样的临时数据:
date tmax tmin dtr
2/13/2014 0 19 8
2/15/2014 2.8 15 10
1/29/2015 10 7 3
1/6/2016 3 4 -1
1/29/2016 2 2 0
5/5/2016 9 11 -2
5/7/2016 11 14 -3
1/29/2017 11 8 3
我需要能够选择DTR小于或等于零的所有行并执行以下操作。
对于那些DTR等于零的行,我想通过以下计算来替换tmax和tmin: 例如2016年1月29日,tmax =(10 + 11)/ 2即计算2016年和2017年2016年的平均值以及tmin的类似方式。
对于那些DTR小于零的行,我想用-99.9替换tmax和tmin
答案 0 :(得分:0)
试试这样:
>>> df
date tmax tmin dtr
0 2/13/2014 0.0 19.0 8.0
1 2/15/2014 2.8 15.0 10.0
2 1/29/2015 10.0 7.0 3.0
3 1/6/2016 3.0 4.0 -1.0
4 1/29/2016 2.0 2.0 0.0
5 5/5/2016 9.0 11.0 -2.0
6 5/7/2016 11.0 14.0 -3.0
7 1/29/2017 11.0 8.0 3.0
>>> df.ix[df['dtr']<0, ['tmax', 'tmin']] = -99.9
>>> df.ix[df['dtr']==0, ['tmax', 'tmin']] = (10+11)/2
>>> df
date tmax tmin dtr
0 2/13/2014 0.0 19.0 8.0
1 2/15/2014 2.8 15.0 10.0
2 1/29/2015 10.0 7.0 3.0
3 1/6/2016 -99.9 -99.9 -1.0
4 1/29/2016 10.0 10.0 0.0
5 5/5/2016 -99.9 -99.9 -2.0
6 5/7/2016 -99.9 -99.9 -3.0
7 1/29/2017 11.0 8.0 3.0
答案 1 :(得分:0)
这可能就是你所追求的目标。
import pandas as pd
# reading the data
df = pd.read_csv('input_data.csv',
delim_whitespace=True,
index_col=0,
parse_dates=True,
dtype={'tmax': 'float',
'tmin': 'float',
'dtr': 'int'})
# setting tmax and tmin to -99.9 if dtr < 0
df.ix[df['dtr']<0, ['tmax', 'tmin']] = -99.9
# iterate over the rows
for row in df.itertuples():
# if the dtr is 0
if row.dtr == 0:
# set date, d to the current row
d = row.Index
# get dates of desired rows before and after d
before = pd.Timestamp(d.year-1, d.month, d.day)
after = pd.Timestamp(d.year+1, d.month, d.day)
# set tmax and tmin to average of the above dates' data
df.ix[d, 'tmax'] = (df.ix[before].tmax + df.ix[after].tmax) / 2
df.ix[d, 'tmin'] = (df.ix[before].tmin + df.ix[after].tmin) / 2
结果数据框为:
tmax tmin dtr
date
2014-02-13 0.0 19.0 8
2014-02-15 2.8 15.0 10
2015-01-29 10.0 7.0 3
2016-01-06 -99.9 -99.9 -1
2016-01-29 10.5 2.0 0
2016-05-05 -99.9 -99.9 -2
2016-05-07 -99.9 -99.9 -3
2017-01-29 11.0 8.0 3