跨数据框的百分位数,缺少值

时间:2019-01-07 22:20:08

标签: python pandas

我有几个熊猫数据框(比如一个普通的python列表),看起来像下面的两个。请注意,随机日期可能会(实际上有)一些缺失值。我需要针对每个日期计算多个数据帧中的TMAX和/或TMAX_ANOM的百分位数,而忽略缺失值。

     YYYY  MM  DD  TMAX  TMAX_ANOM
0   1980   7   1  13.0   2.333333
1   1980   7   2  14.3   2.566667
2   1980   7   3  15.6   2.800000
3   1980   7   4  16.9   3.033333
4   1980   8   1  18.2   3.266667
5   1980   8   2  19.5   3.500000
6   1980   8   3  20.8   3.733333
7   1980   8   4  22.1   3.966667
8   1981   7   1  10.0  -0.666667
9   1981   7   2  11.0  -0.733333
10  1981   7   3  12.0  -0.800000
11  1981   7   4  13.0  -0.866667
12  1981   8   1  14.0  -0.933333
13  1981   8   2  15.0  -1.000000
14  1981   8   3  16.0  -1.066667
15  1981   8   4  17.0  -1.133333
16  1982   7   1   9.0  -1.666667
17  1982   7   2   9.9  -1.833333
18  1982   7   3  10.8  -2.000000
19  1982   7   4  11.7  -2.166667
20  1982   8   1  12.6  -2.333333
21  1982   8   2  13.5  -2.500000
22  1982   8   3  14.4  -2.666667
23  1982   8   4  15.3  -2.833333

     YYYY  MM  DD  TMAX  TMAX_ANOM
0   1980   7   1  14.0   3.666667
1   1980   7   2  15.4   4.033333
2   1980   7   3  16.8   4.400000
3   1980   7   4  18.2   4.766667
4   1980   8   1  19.6   5.133333
6   1980   8   3  22.4   5.866667
7   1980   8   4  23.8   6.233333
8   1981   7   1  10.0  -0.333333
9   1981   7   2  11.0  -0.366667
10  1981   7   3  12.0  -0.400000
11  1981   7   4  13.0  -0.433333
12  1981   8   1  14.0  -0.466667
13  1981   8   2  15.0  -0.500000
14  1981   8   3  16.0  -0.533333
15  1981   8   4  17.0  -0.566667
16  1982   7   1   7.0  -3.333333
17  1982   7   2   7.7  -3.666667
18  1982   7   3   8.4  -4.000000
19  1982   7   4   9.1  -4.333333
20  1982   8   1   9.8  -4.666667
21  1982   8   2  10.5  -5.000000
23  1982   8   4  11.9  -5.666667

因此,为了清楚起见,在本示例中,只有两个数据框(并假设百分位数是中位数,以简化讨论),作为输出,我需要一个包含24个元素,相同的YYYY / MM / DD字段和TMAX(和/或TMAX_ANOM)替换如下:对于1980/7/1,它的中间值必须在13到14之间;对于1980/7/2,它的中间值必须在14.3和15.4之间,依此类推。当缺少值时(例如此处第二个数据帧中的1980/8/2),必须仅从其余数据帧中计算出中位数-因此,在这种情况下,该值将仅为19.5

我无法找到一种干净的方法来实现此目标,无论是numpy还是pandas。有什么建议还是我应该求助于手动循环?

1 个答案:

答案 0 :(得分:0)

#dates as indexes
df1.index = pd.to_datetime(dict(year = df1.YYYY, month = df1.MM, day = df1.DD))
df2.index = pd.to_datetime(dict(year = df2.YYYY, month = df2.MM, day = df2.DD))

#binding useful columns
new_df = df1[['TMAX','TMAX_ANOM']].join(df2[['TMAX','TMAX_ANOM']], lsuffix = '_df1', rsuffix = '_df2')

#calculating quantile
new_df['TMAX_quantile'] = new_df[['TMAX_df1', 'TMAX_df2']].quantile(0.5, axis = 1)