我正在尝试从包含两列的数据帧中计算一种联合概率分布。但是,当给定列(或行)的概率始终为零时,我找不到添加列的方法。
考虑以下示例:
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
。
那我如何为一个实际存在但未使用的类别设置一个值?
答案 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