在 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
以下面的输入为例,我试图根据其他人的独特实例在 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