python - 如何设置与未使用的分类区间索引相对应的 pandas 数据帧列中的值?

标签 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×10 数据帧的代码出现一些问题。

但是我找不到添加列的方法

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

告诉我ValueError:无法插入(8, 9],已经存在

interval in prob.columns.categories

正确,但是

prob[interval]

给出KeyError:8

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

最佳答案

您只需在此处.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

关于python - 如何设置与未使用的分类区间索引相对应的 pandas 数据帧列中的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54405974/

相关文章:

python - Python函数中的默认参数在哪里

python - ('a' 中的 'abc' == True)评估为 False

python - Pandas 创建一个数据框,其条目是另一个数据框的行之间的关系?

Python sklearn 所有记录的余弦相似度循环

python - 错误的指数幂图 - 如何改进曲线拟合

python - '\b' 在 Python 中如何工作?

python - 在 MPI Python 程序中查找 SegFault 的一般建议

python - 如何绘制 pandas 数据框的第二列?

python - Pandas :比日期小的最大索引

Pandas 重采样 : add columns of group_id