熊猫:在分类数据框中添加一列

时间:2019-01-11 11:30:20

标签: python pandas

我的原始数据如下:

Bin         A     B     C
CPB%                     
0.00000     0    57  1728
0.00100     0  1579  1240
0.00200  1360   488   869
0.00300   184   499   597
0.00400   265   283   461

由于该代码,我获得了它:

import operator
bins = np.linspace(0, 1, num=1000)

df_b = pd.crosstab(pd.cut(df['CPB%'], bins=bins).map(operator.attrgetter('left')), df.Bin)

我试图做的是以下事情:

totalb = df_b['A'].sum()
idxb = totalb
proba_b = []


for index, row in df_b.iterrows():
    idxb = idxb - row['A']
    prob = float(idxb)/float(totalb)
    proba_b.append(prob)

df_b['Proba-b'] = proba_b

但是当我尝试向此分类数据帧添加新列时,出现以下错误:'cannot insert an item into a CategoricalIndex that is not already an existing category'

我试图将一个新的数据框附加到现有的数据框上,但是没有用……有什么想法吗?谢谢!

1 个答案:

答案 0 :(得分:2)

您需要CategoricalIndex.add_categories才能通过新列名添加新类别:

df_b.columns = df_b.columns.add_categories('Proba-b')
df_b['Proba-b'] = proba_b
print (df_b)

          A     B     C   Proba-b
Bin                              
0.000     0    57  1728  1.000000
0.001     0  1579  1240  1.000000
0.002  1360   488   869  0.248203
0.003   184   499   597  0.146490
0.004   265   283   461  0.000000

为了提高性能,可以使用iterrows

s = df_b['A']
df_b['Proba-b'] = (s.iloc[::-1].cumsum()).shift().fillna(0) / s.sum()
print (df_b)

          A     B     C   Proba-b
Bin                              
0.000     0    57  1728  1.000000
0.001     0  1579  1240  1.000000
0.002  1360   488   869  0.248203
0.003   184   499   597  0.146490
0.004   265   283   461  0.000000