使用气候学数据填写缺失值,当前年份除外

时间:2016-10-07 09:08:34

标签: python pandas

df.groupby([df.index.month, df.index.day])[vars_rs].transform(lambda y: y.fillna(y.median()))

我在数据框中用气候学中值来填充缺失值。这些日子的范围从2010年1月1日到2016年12月31日。但是,我只想在当前日期之前填写缺失值(比如2016年10月1日)。如何修改声明?

2 个答案:

答案 0 :(得分:1)

使用np.where,例如:

import pandas as pd
import numpy as np
df = pd.DataFrame({'A':['a','a','b','b','c','c'],'B':[1,2,3,4,5,6],'C':[1,np.nan,np.nan,np.nan,np.nan,np.nan]})
df.ix[:,'C'] = np.where((df.A != 'c')&(df.B < 4)&(pd.isnull(df.C)),-99,df.ix[:,'C'])

像这样,您可以使用布尔表达式和所有列直接修改所需的列。

原始数据框:

   A  B    C
0  a  1  1.0
1  a  2  NaN
2  b  3  NaN
3  b  4  NaN
4  c  5  NaN
5  c  6  NaN

修改后的数据框:

   A  B     C
0  a  1   1.0
1  a  2 -99.0
2  b  3 -99.0
3  b  4   NaN
4  c  5   NaN
5  c  6   NaN

答案 1 :(得分:1)

算法将是:

  1. 获取数据框的一部分,其中仅包含使用布尔掩码按日期过滤的行
  2. 在其上执行所需的替换
  3. 将初始数据框的其余部分附加到结果数据框的末尾。
  4. 虚拟数据:

    df = pd.DataFrame(np.zeros((5, 2)),columns=['A', 'B'],index=pd.date_range('2000',periods=5,freq='M'))
    
                A   B
    2000-01-31  0.0 0.0
    2000-02-29  0.0 0.0
    2000-03-31  0.0 0.0
    2000-04-30  0.0 0.0
    2000-05-31  0.0 0.0
    

    代码

    vars_rs = ['A', 'B']
    mask = df.index < '2000-03-31'
    early = df[mask]
    early = early.groupby([early.index.month, early.index.day])[vars_rs].transform(lambda y: y.replace(0.0, 1))  # replace with your code
    result = early.append(df[~mask])
    

    结果是

                A   B
    2000-01-31  1.0 1.0
    2000-02-29  1.0 1.0
    2000-03-31  0.0 0.0
    2000-04-30  0.0 0.0
    2000-05-31  0.0 0.0