首页 > 解决方案 > 创建具有所需值的对称熊猫 GroupBy

问题描述

考虑以下数据。

我的数据有一些缺失值,即

有没有一种GroupBy方法可以填充数据使其对称?从某种意义上说,它是对称的,['Project', 'Stage']因此不具有该类别的数据通过使用预定义/计算值填充它们来扩展(在此示例中,值为 0)。为了更清楚,请在底部查看所需的输出。

我浏览了文档,但我迷失在文档的海洋中。非常感谢一些提示或指示!谢谢!

import pandas as pd
from io import StringIO
import numpy as np

data = """  x   y   Project Stage
0   -10.540327  61.649657999999995  P1  S2
1   32.379704   -130.71579599999998 P1  S2
2   -2.620516   71.260701   P1  S2
3   13.978546   31.711221000000002  P1  S4
4   41.391873   88.070636   P1  S4
5   -0.303671   -84.376145  P1  S4
6   -65.370553  -7.694756   P2  S3
7   9.062894    177.233938  P2  S3
8   17.029269   -100.364923 P2  S3
9   13.354712   73.78603100000001   P2  S2
10  18.781817999999998  -109.3554   P2  S2
11  67.189193   113.94348000000001  P2  S2
12  8.762746    128.735548  P2  S1
13  59.287251   11.017662   P2  S1
14  -2.4981430000000002 -166.897776 P2  S1
15  1.1900870000000001  -82.309501  P3  S3
16  21.938575   -118.20861699999999 P3  S3
17  45.414544   122.49246000000001  P3  S3
18  -36.322626  -63.310702  P3  S2
19  53.568994999999994  141.37641100000002  P3  S2
20  26.129929999999998  153.706601  P3  S2
21  -3.9384330000000003 102.90164399999999  P3  S6
22  -8.198288   137.616797  P3  S6
23  -8.240618   -146.80676  P3  S6
24  15.193395   25.697023   P3  S5
25  20.886185   68.356337   P3  S5
26  -22.101129999999998 89.639481   P3  S5"""

df = pd.read_csv(StringIO(data), sep='\t', index_col=0)

df.groupby(['Project', 'Stage']).count()

它返回:

分组计数

我目前的解决方法

def create_df(p, s):
    return pd.DataFrame({
        'Project': [p] * 3,
        'Stage': [s] * 3
    })

df.append([
    create_df('P1', 'S1'),
    create_df('P1', 'S3'),
    create_df('P2', 'S4')
]).groupby(['Project', 'Stage']).count()

pandas 中是否有一种优雅的方式来填充其他数据,所以结果如下:

期望的输出

标签: pandaspandas-groupby

解决方案


  1. 为您分组的两列创建可迭代数组(见i下文)
  2. 做你在问题中所做的 groupby
  3. .reindex(index=pd.MultiIndex.from_product()在您的数据框上使用并i从步骤 1 和您分组的两列传递。最后,填写0并使用.sort_values相关栏目。

代码:

i = [df['Project'].unique(), df['Stage'].unique()]
df = df.groupby(['Project', 'Stage']).count()
df = df.reindex(index=pd.MultiIndex.from_product(i, names=['Project', 'Stage']),
              fill_value=0).reset_index().sort_values(['Project', 'Stage'])
df

输出:

    Project Stage   x   y
3   P1      S1      0   0
0   P1      S2      3   3
2   P1      S3      0   0
1   P1      S4      3   3
5   P1      S5      0   0
4   P1      S6      0   0
9   P2      S1      3   3
6   P2      S2      3   3
8   P2      S3      3   3
7   P2      S4      0   0
11  P2      S5      0   0
10  P2      S6      0   0
15  P3      S1      0   0
12  P3      S2      3   3
14  P3      S3      3   3
13  P3      S4      0   0
17  P3      S5      3   3
16  P3      S6      3   3

推荐阅读