我有一个pandas数据框,如下所示:

id     group    type    action    cost
101    A        1                 10
101    A        1       repair    3
102    B        1                 5
102    B        1       repair    7
102    B        1       grease    2
102    B        1       inflate   1
103    A        2                 12
104    B        2                 9


我需要从长到宽调整它的形状,但是取决于action列的值,如下所示:

id     group    type    action_std    action_extra
101    A        1       10            3
102    B        1       5             10
103    A        2       12            0
104    B        2       9             0


换句话说,对于action字段为空的行,cost值应放在action_std列下,而对于非action字段的行,应将cost值汇总在action_extra列。

我尝试使用groupby / agg / pivot的几种组合,但是我找不到任何可以正常使用的解决方案...

最佳答案

我建议您只需将cost列拆分为costcost_extra列。类似于以下内容:

import numpy as np

result = df.assign(
    cost_extra=lambda df: np.where(
        df['action'].notnull(), df['cost'], np.nan
    )
).assign(
    cost=lambda df: np.where(
        df['action'].isnull(), df['cost'], np.nan
    )
).groupby(
    ["id", "group", "type"]
)["cost", "cost_extra"].agg(
    "sum"
)


result看起来像:

                cost  cost_extra
id  group type
101 A     1     10.0         3.0
102 B     1      5.0        10.0
103 A     2     12.0         0.0
104 B     2      9.0         0.0

关于python - Pandas 通过条件检查重塑了从长到宽的多列数据框,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57742001/

10-12 07:20