这个问题是前一个问题的延续:pandas: trouble transforming dataframe into aggregated dataframe
让问题变得复杂一些。如果我有如下所示的表格怎么办? STATUS是具有3个可能值的分类变量。但是,我希望按组显示每个STATUS的百分比(即使它不存在于原始数据中)。
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',我希望生成UNKNOWN 0.0行,即使它在原始数据帧中不存在。在分类上执行values_count()将报告'UNKNOWN'频率,但是如何将其导入数据帧然后使用索引等?再次感谢。
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
答案 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