pandas:麻烦将数据帧转换为聚合数据帧(第2部分)

时间:2015-06-06 05:39:32

标签: pandas

这个问题是前一个问题的延续: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

1 个答案:

答案 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