如何在未使用的分类间隔索引对应的pandas数据框列中设置值?

时间:2019-01-28 16:06:51

标签: python pandas

我正在尝试从包含两列的数据帧中计算一种联合概率分布。但是,当给定列(或行)的概率始终为零时,我找不到添加列的方法。

考虑以下示例:

import pandas as pd
import numpy as np
x = np.random.rand(1000)*10
y = np.random.rand(1000)*8
df = pd.DataFrame({'x':x, 'y':y})

prob = df.groupby(
                   [pd.cut(df['x'], list(range(0,11))),
                    pd.cut(df['y'], list(range(0,11)))]
                 ).size().unstack().fillna(0) / len(df)

由于y的范围是0到8,因此数据帧中不存在第(8,9]和(9,10]列,这会导致以下代码出现问题,这些代码期望使用10 x 10数据帧。

但是我找不到添加列为

的方法
interval = pd.Interval(left=8, right=9)
prob[interval] = 0

告诉我ValueError: cannot insert (8, 9], already exists

interval in prob.columns.categories

True,但是

prob[interval]

给出KeyError: 8

那我如何为一个实际存在但未使用的类别设置一个值?

1 个答案:

答案 0 :(得分:3)

您只需要在这里.reindex

您已经指标有类别列出,但他们是如此某处的决定被不创建“无用”的行或列所做的未使用的水平。

prob.columns.categories
#IntervalIndex([(0, 1], (1, 2], (2, 3], (3, 4], (4, 5], (5, 6], (6, 7], (7, 8], (8, 9], (9, 10]]
#              closed='right',
#              dtype='interval[int64]')

因此明确地为这些索引重新编制索引:

prob.reindex(prob.columns.categories, axis=1).fillna(0)

您可以做同样的沿指数如果需要确保那些永远都是存在的:

prob.reindex(prob.index.categories, axis=0).fillna(0)

输出:

y        (0, 1]  (1, 2]  (2, 3]  (3, 4]  (4, 5]  (5, 6]  (6, 7]  (7, 8]  (8, 9]  (9, 10]
x                                                                                       
(0, 1]    0.004   0.008   0.011   0.013   0.010   0.011   0.013   0.011     0.0      0.0
(1, 2]    0.007   0.013   0.013   0.015   0.017   0.015   0.009   0.014     0.0      0.0
(2, 3]    0.013   0.014   0.012   0.008   0.012   0.011   0.012   0.012     0.0      0.0
(3, 4]    0.014   0.014   0.010   0.012   0.016   0.016   0.013   0.008     0.0      0.0
(4, 5]    0.011   0.014   0.014   0.018   0.019   0.015   0.014   0.008     0.0      0.0
(5, 6]    0.011   0.012   0.012   0.012   0.013   0.013   0.014   0.011     0.0      0.0
(6, 7]    0.007   0.017   0.011   0.009   0.008   0.016   0.018   0.019     0.0      0.0
(7, 8]    0.015   0.010   0.008   0.012   0.012   0.008   0.016   0.013     0.0      0.0
(8, 9]    0.015   0.012   0.016   0.010   0.017   0.012   0.014   0.015     0.0      0.0
(9, 10]   0.008   0.010   0.012   0.018   0.008   0.012   0.019   0.011     0.0      0.0