Pandas 熊猫:将数据帧转换为聚合数据帧的问题(第2部分)
这个问题是前一个问题的延续: 让我们把问题弄复杂一点。如果我有一张如下所示的表格呢。状态是一个分类变量,包含3个可能的值。但是,我希望按组列出每个状态的发生率百分比(即使原始数据中不存在)Pandas 熊猫:将数据帧转换为聚合数据帧的问题(第2部分),pandas,Pandas,这个问题是前一个问题的延续: 让我们把问题弄复杂一点。如果我有一张如下所示的表格呢。状态是一个分类变量,包含3个可能的值。但是,我希望按组列出每个状态的发生率百分比(即使原始数据中不存在) 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-01 A 1 1 UNKNOWN 2014-01-02 B 0 0 PASS
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-01 A 1 1 UNKNOWN
2014-01-02 B 0 0 PASS
2014-01-02 B 0 1 PASS
2014-01-02 B 1 1 FAIL
这应该变成如下所示。请注意,对于组“B”,我希望也生成未知的0.0行,即使它不在原始数据帧中。在一个分类上执行values_count()将报告“未知”频率,但如何将其放入数据帧,然后进行索引,等等?再次感谢
GROUP STATUS PCT
2014-01-01 A PASS 0.5
2014-01-01 A FAIL 0.25
2014-01-01 A UNKNOWN 0.25
2014-01-02 B PASS 0.667
2014-01-02 B FAIL 0.333
2014-01-02 B UNKNOWN 0.0
我提出了一个解决方案,看起来有点麻烦。也许有更简单的方法
import pandas as pd
>>> a = pd.DataFrame({'G' : ['A', 'A', 'A', 'B', 'B', 'B'], 'X' : [0,1,2,0,1,2], 'Y' : [0,0,0,0,0,0], 'STATUS' : ['PASS', 'FAIL', 'PASS', 'UNKNOWN', 'PASS', 'PASS']})
>>> t = pd.to_datetime('2015-06-03')
>>> a.set_index(pd.DatetimeIndex(pd.Series([t] * len(a.index))))
>>> a['STATUS'] = a['STATUS'].astype('category', categories=['PASS', 'FAIL', 'UNKNOWN'])
G STATUS X Y
2015-06-03 A PASS 0 0
2015-06-03 A FAIL 1 0
2015-06-03 A PASS 2 0
2015-06-03 B UNKNOWN 0 0
2015-06-03 B PASS 1 0
2015-06-03 B PASS 2 0
>>> b = a.groupby('G')['STATUS'].apply(lambda x: x.value_counts() / x.count()).reset_index()
>>> b.rename(columns={'level_1' : 'STATE', 0 : 'PCT'}, inplace=True)
>>> b
G STATE PCT
0 A PASS 0.666667
1 A FAIL 0.333333
2 A UNKNOWN 0.000000
3 B PASS 0.666667
4 B UNKNOWN 0.333333
5 B FAIL 0.000000
>>> c = pd.merge(a,b, right_index=True, on=['G'])
>>> c.drop(['STATUS', 'X', 'Y'], axis=1, inplace=True)
>>> c.drop_duplicates()
G STATE PCT
2015-06-03 A PASS 0.666667
2015-06-03 A FAIL 0.333333
2015-06-03 A UNKNOWN 0.000000
2015-06-03 B PASS 0.666667
2015-06-03 B UNKNOWN 0.333333
2015-06-03 B FAIL 0.000000