【问题标题】:pandas: trouble transforming dataframe into aggregated dataframe (part2)pandas:将数据框转换为聚合数据框时遇到问题(第 2 部分)
【发布时间】:2015-06-06 15:44:40
【问题描述】:

这个问题是上一个问题的延续: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() 将报告“未知”频率,但是如何将其放入数据框中,然后使用索引等?再次感谢。

  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

【问题讨论】:

    标签: pandas


    【解决方案1】:

    这是我想出的一个似乎有点麻烦的解决方案。也许有更简单的方法?

        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
    

    【讨论】:

      猜你喜欢
      • 2015-08-20
      • 1970-01-01
      • 1970-01-01
      • 2020-05-22
      • 2020-04-03
      • 1970-01-01
      • 1970-01-01
      • 2018-09-07
      • 2020-06-17
      相关资源
      最近更新 更多