pandas:麻烦将数据帧转换为聚合数据帧

时间:2015-06-05 22:03:06

标签: pandas

我是熊猫的新用户。我一直在浏览帮助文档,并尝试各种实验(groupby(),multiindex,value_cuounts())。但是我无法获得理想的最终结果。

我的数据框如下(时间索引):

DATE, GROUP, X, Y, STATUS
2014-01-01  A  0 0 PASS
2014-01-01  A  0 1 FAIL
2014-01-01  A  1 0 PASS
2014-01-02  B  0 0 PASS
2014-01-02  B  0 1 PASS
2014-01-02  B  1 1 FAIL
....

'STATUS'列是dtype = category。我想最终得到一个新的数据框,如下所示:

DATE GROUP STATUS  PCT
2014-01-01 A PASS 0.667
2014-01-01 A FAIL 0.333
2014-01-02 B PASS 0.667
2014-01-02 B FAIL 0.333

基本上,对于每个组,我想计算所有状态的百分比。

我尝试过df.groupby('GROUP')。value_counts()后跟除以sum()来计算百分比。这很好用。但是,我丢失了索引信息,我不知道将它添加到新数据帧以实现上面所需的输出。在熊猫中必须有一些简单的方法来做到这一点,但我没有看到它。

任何建议都表示赞赏。感谢。

1 个答案:

答案 0 :(得分:0)

我会在“DATE”和“GROUP”列上执行groupby,然后在“状态”列上调用transform并致电value_counts / counttransform将返回与您的orig df对齐的系列,因此它允许您将其添加回新列:

In [64]:

df['PCT'] = df.groupby(['DATE','GROUP'])['STATUS'].transform(lambda x: x.value_counts() / x.count())
df
Out[64]:
         DATE GROUP  X  Y STATUS        PCT
0  2014-01-01     A  0  0   PASS  0.6666667
1  2014-01-01     A  0  1   FAIL  0.3333333
2  2014-01-01     A  1  0   PASS  0.6666667
3  2014-01-02     B  0  0   PASS  0.6666667
4  2014-01-02     B  0  1   PASS  0.3333333
5  2014-01-02     B  1  1   FAIL  0.6666667