如何df.groupby.sum合计只有一列

2024-04-24 17:32:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个pandas数据帧df(参见示例),它有以下列:master IDsub ID(子对象的master ID)、子ID的价格和每个主ID/子ID的场景计数。我想找出每个主ID的价格pct\ U在不同场景中的变化,如示例所示。主ID价格是子ID价格的总和。抱歉,如果这不清楚。你知道吗

迄今为止已经尝试过的:

df.sort_values(by="scenario", ascending=False).groupby('subID').head(n=1)

测向和期望结果示例

Example of df and desired result


Tags: 数据对象masterid示例pandasdfby
2条回答

因此,第一步是按主id和场景分组,然后取消堆叠场景以获得每个场景的列:

df_scen = df.groupby(['master id', 'scenario']).agg({'price': 'sum'}).unstack('scenario')

下一步是为%change创建一个新列。您可能需要稍微处理一下列名,但它应该如下所示:

df_scen['% change'] = 100 * df_scen[('scenario', 2)] / df_scen[('scenario', 1)] - 100

编辑

如果每个主ID有多个方案,并且只需要最新的两个方案:

# Group and sort in descending order of scenario
grp = df.sort_values(['master id', 'scenario'], ascending=False).groupby('master id')

# Get only the latest and previous scenarios
df_first = grp.nth(0).reset_index()  # synonymous to .first()
df_first['rev_scen'] = 'current'
df_second = grp.nth(1).reset_index()
df_second['rev_scen'] = 'previous'

df_latest = df_first.append(df_second) # Merge the two

# From here on it's basically the same as the original answer
df_scen = df_latest.groupby(['master id', 'rev_scen']).agg({'price': 'sum'}).unstack('rev_scen')
df_scen['% change'] = 100 * df_scen[('price', 'current')] / df_scen[('price', 'previous')] - 100

试试这个:

In [38]: df
Out[38]:
    id  master_id  price  scenario
0  101          1    400         1
1  102          1    550         1
2  101          1    650         2
3  102          1    400         2
4  201          2    500         1
5  201          2    600         2
6  301          2    500         3
7  301          2    600         3

In [39]: g = df.groupby(['master_id','scenario'], as_index=False)['price']\
   ....:       .sum()\
   ....:       .pivot(index='master_id', columns='scenario', values='price')\
   ....:       .reset_index()

In [40]: g
Out[40]:
scenario  master_id      1       2       3
0                 1  950.0  1050.0     NaN
1                 2  500.0   600.0  1100.0

相关问题 更多 >