我正在尝试从包含两列的数据帧计算一种联合概率分布。但是,当给定列(或行)的概率始终为零时,我找不到添加列的方法。
考虑以下示例:
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/