在 Python 中填充聚合列

Filling aggregated column in Python

以下面的输入为例,我试图根据其他人的独特实例在 Python 的数据框中创建聚合列。我能做的最好的尝试在新专栏中留下了一些 NaN

raw_data = {'RegionCode' : ['10001', '10001', '10001', '10001', '10001', '10001', '10002', '10002', '10002', '10002', '10002', '10002'],
            'Stratum' : ['1', '1','2','2','3', '3', '1', '1', '2', '2', '3', '3'],
            'LaStratum' : ['1021', '1021', '1022', '1022', '1023', '1023', '2021', '2021', '2022', '2022', '2023', '2023'],
            'StratumPop' : [125, 125, 50, 50, 100, 100, 250, 250, 200, 200, 300, 300],
            'Q_response' : [2, 1, 4, 1, 2, 2, 3, 4, 3, 2, 1, 4]}



Data = pd.DataFrame(raw_data, columns = ['RegionCode', 'Stratum', 'LaStratum', 'StratumPop', 'Q_response'])

#Sum StratumPop by unique instance of LaStratum at RegionCode level
Data['Total_Pop'] = Data.drop_duplicates(['LaStratum']).groupby('RegionCode')['StratumPop'].transform('sum')

Data

我想做的是按每个唯一的 LaStratum 实例对 RegionCode 级别的 StratumPop 列求和。产生的总计是正确的,但我如何 'fill' 该列重复每个总计,而不是只看到每个不同总计的第一次出现和其他总计的 NaN ?因此,区域 10001 每行有 275 个,区域 10002 每行有 750 个。如果不创建登台表并将唯一值重新合并(正如我目前正在做的那样),这是否可能?

看看

Total_pop=Data.drop_duplicates(['LaStratum']).groupby('RegionCode')['StratumPop'].sum()

现在创建一个函数:-

def func(val):
    if val==Total_pop.index[0]:
        return Total_pop.values[0]
    else:
        return Total_pop.values[1]

终于用上了apply()方法

Data['Total_pop']=Data['RegionCode'].apply(func)

输出:-

    RegionCode  Stratum     LaStratum   StratumPop  Q_response  Total_pop
0   10001   1       1021    125     2   275
1   10001   1       1021    125     1   275
2   10001   2       1022    50      4   275
3   10001   2       1022    50      1   275
4   10001   3       1023    100     2   275
5   10001   3       1023    100     2   275
6   10002   1       2021    250     3   750
7   10002   1       2021    250     4   750
8   10002   2       2022    200     3   750
9   10002   2       2022    200     2   750
10  10002   3       2023    300     1   750
11  10002   3       2023    300     4   750

要填充该列并在每个区域重复每个 Total_Pop,您可以使用简单的分组(按区域本身)ffill():

Data['Total_Pop_new'] = Data.groupby('RegionCode')['Total_Pop'].ffill()

会给你回报:

Data

   RegionCode Stratum LaStratum  ...  Q_response  Total_Pop  Total_Pop_new
0       10001       1      1021  ...           2      275.0          275.0
1       10001       1      1021  ...           1        NaN          275.0
2       10001       2      1022  ...           4      275.0          275.0
3       10001       2      1022  ...           1        NaN          275.0
4       10001       3      1023  ...           2      275.0          275.0
5       10001       3      1023  ...           2        NaN          275.0
6       10002       1      2021  ...           3      750.0          750.0
7       10002       1      2021  ...           4        NaN          750.0
8       10002       2      2022  ...           3      750.0          750.0
9       10002       2      2022  ...           2        NaN          750.0
10      10002       3      2023  ...           1      750.0          750.0
11      10002       3      2023  ...           4        NaN          750.0