【问题标题】:DataFrame: how do I find value in one column for a quantile in a second columnDataFrame:如何在一列中找到第二列中的分位数的值
【发布时间】:2019-07-28 02:10:26
【问题描述】:

我有一个如下所示的 DataFrame,其中包含日期、偏移量和计数。

例如,这是数据帧的开始

df = pd.DataFrame(np.array([['2018-01-01', 0, 1], ['2018-01-01', 26, 2], ['2018-01-01', 178, 8], ['2018-01-01', 187, 10], ['2018-01-01', 197, 13], ['2018-01-01', 208, 15], ['2018-01-01', 219, 16], ['2018-01-01', 224, 19],['2018-01-01', 232, 21], ['2018-01-01', 233, 25], ['2018-01-01', 236, 32],['2018-01-02', 0, 1], ['2018-01-02', 11, 4], ['2018-01-02', 12, 7], ['2018-01-02', 20, 12], ['2018-01-02', 35, 24], ]), columns=['obs_date', 'offset', 'count'])

    obs_date    offset  count
0   2018-01-01  0       1
1   2018-01-01  26      2
2   2018-01-01  178     8
3   2018-01-01  187     10
4   2018-01-01  197     13
5   2018-01-01  208     15
6   2018-01-01  219     16
7   2018-01-01  224     19
8   2018-01-01  232     21
9   2018-01-01  233     25
10  2018-01-01  236     32
11  2018-01-02  0       1
12  2018-01-02  11      4
13  2018-01-02  12      7
14  2018-01-02  20      12
15  2018-01-02  35      24

我想获取每个日期的(累积)['count'] 分位数 [0.25, 0.5, 0.75] 并找到该分位数适用的 ['offset'] 行。 每个日期的总计数会有所不同,并且偏移量不规则 所以对于 2018-01-01,日期和偏移量对应于 8、16 和 24(0.25、0.5、0.75 * 32)的计数

类似

0   2018-01-01  178     0.25
1   2018-01-01  219     0.5
2   2018-01-01  232.75  0.75
3   2018-01-02  43      0.25
etc     

【问题讨论】:

  • 我很困惑。您想根据哪一列设置分位数? cumsum 是哪一列?

标签: python pandas quantile


【解决方案1】:

这对我有用:

df['count'] = df['count'].astype(int)
quantiles = [.25, .5, .75]

def get_offset(x):
    s = x['count']
    indices = [(s.sort_values()[::-1] <= s.quantile(q)).idxmax() for q in quantiles]
    return df.iloc[indices, x.columns.get_loc('offset')]

res = df.groupby('obs_date').apply(get_offset).reset_index(level=0)

那你可以concat用分位数:

pd.concat([res.reset_index(drop=True), pd.Series(quantiles * df.obs_date.nunique())], axis=1)

    obs_date    offset  0
0   2018-01-01  178     0.25
1   2018-01-01  208     0.50
2   2018-01-01  224     0.75
3   2018-01-02  11      0.25
4   2018-01-02  12      0.50
5   2018-01-02  20      0.75

【讨论】:

  • 谢谢,但看起来不太正确 - 我希望第 2 行读取 232 或 233,因为 Q3 在第 8/9 行之间 - 它不是真正的分位数(),因为我正在寻找值 0.75 * 32 而不是列表中 3/4 的值,这段代码给了我一个好的开始,所以我希望创建一个 max_count 列和一个比例列(count / max_count)并找到值用那种方式使用 idmax?
  • 次要 mod - 添加了一个列 max_count 并从中派生 df['propn'] = df'[count'] / df['max_count']。因此 get_offset 的行只是 s = x['propn'] indices = [(s.sort_values()[::-1]
  • 是的,我注意到我的价值观有点偏离。我看到你接受了答案,谢谢!那么就这样解决了吗?
  • 这非常有帮助,谢谢 - 给了我解决它所需的结构 - 对于以后来的人 - 不需要 .quartile() 方法,因为这是累积计数而不是观察
  • 太棒了 :) 随时编辑我的答案,或发布您自己的答案
猜你喜欢
  • 2022-11-30
  • 2017-09-27
  • 2021-11-11
  • 1970-01-01
  • 2021-10-22
  • 1970-01-01
  • 2021-05-04
  • 2018-05-08
  • 1970-01-01
相关资源
最近更新 更多