我有一个合并的数据框如下:
>>> merged_df.dtypes
Jurisdiction object
AdjustedVolume float64
EffectiveStartDate datetime64[ns]
VintageYear int64
ProductType object
Rate float32
Obligation float32
Demand float64
Cost float64
dtype: object
以下groupby语句按管辖区/年份返回正确的AdjustedVolume值:
>>> merged_df.groupby(['Jurisdiction', 'VintageYear'])['AdjustedVolume'].sum()
包含ProductType:
>>> merged_df.groupby(['Jurisdiction', 'VintageYear','ProductType'])['AdjustedVolume'].sum()
如果Jurisdiction只包含一个ProductType,则Year by AdjustedVolume是正确的,但对于具有两个或更多ProductTypes的任何Jurisdiction,AdjustedVolumes将被拆分,以便它们总和为正确的值。我期待每一行都有调整后的总量,并且不清楚它为什么被拆分。
示例:
>>> merged_df.groupby(['Jurisdiction', 'VintageYear'])['AdjustedVolume'].sum()
Jurisdiction VintageYear AdjustedVolume
CA 2017 3.529964e+05
>>> merged_df.groupby(['Jurisdiction', 'VintageYear','ProductType'])['AdjustedVolume'].sum()
Jurisdiction VintageYear ProductType AdjustedVolume
CA 2017 Bucket1 7.584832e+04
CA 2017 Bucket2 1.308454e+05
CA 2017 Bucket3 1.463026e+05
我怀疑merge_asof做错了:
>>> df1.dtypes
Jurisdiction object
ProductType object
VintageYear int64
EffectiveStartDate datetime64[ns]
Rate float32
Obligation float32
dtype: object
>>> df2.dtypes
Jurisdiction object
AdjustedVolume float64
EffectiveStartDate datetime64[ns]
VintageYear int64
dtype: object
因为df2没有ProductType字段,所以下面的合并将总体积分解为每个管辖区域下的任何ProductTypes。我可以修改以下合并,以便每个ProductType具有总调整量?
merged_df = pd.merge_asof(df2, df1, on='EffectiveStartDate', by=['Jurisdiction','VintageYear'])
答案 0 :(得分:2)
您可以使用组的两个版本并合并这两个表。 第一个表是ProductType的group by,它会按ProductType打破您的AdjustedVolume。
df = df.groupby(['Jurisdiction','VintageYear','ProductType']).agg({'AdjustedVolume':'sum'}).reset_index(drop = False)
然后创建另一个表而不包括ProductType(这是总金额的来源)。
df1 = df.groupby(['Jurisdiction','VintageYear']).agg({'AdjustedVolume':'sum'}).reset_index(drop = False)
现在在两个表中创建一个ID列,以使合并正常工作。
df['ID'] = df['Jurisdiction'].astype(str)+'_' +df['VintageYear'].astype(str)
df1['ID'] = df1['Jurisdiction'].astype(str)+'_'+ df1['VintageYear'].astype(str)
现在合并ID以获得总调整量。
df = pd.merge(df, df1, left_on = ['ID'], right_on = ['ID'], how = 'inner')
最后一步是清理你的专栏。
df = df.rename(columns = {'AdjustedVolume_x':'AdjustedVolume',
'AdjustedVolume_y':'TotalAdjustedVolume',
'Jurisdiction_x':'Jurisdiction',
'VintageYear_x':'VintageYear'})
del df['Jurisdiction_y']
del df['VintageYear_y']
您的输出将如下所示:
答案 1 :(得分:0)
还要考虑transform来检索与其他记录内联的分组聚合,类似于SQL中的子查询聚合。
grpdf = merged_df.groupby(['Jurisdiction', 'VintageYear','ProductType'])['AdjustedVolume']\
.sum().reset_index()
grpdf['TotalAdjVolume'] = merged_df.groupby(['Jurisdiction', 'ProductType'])['AdjustedVolume']\
.transform('sum')