Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pandas 熊猫:将数据帧转换为聚合数据帧的问题(第2部分)_Pandas - Fatal编程技术网

Pandas 熊猫:将数据帧转换为聚合数据帧的问题(第2部分)

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

这个问题是前一个问题的延续:

让我们把问题弄复杂一点。如果我有一张如下所示的表格呢。状态是一个分类变量,包含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
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