Python 如何指定对以前的记录进行操作的groupby操作?

Python 如何指定对以前的记录进行操作的groupby操作?,python,pandas,dataframe,group-by,pandas-groupby,Python,Pandas,Dataframe,Group By,Pandas Groupby,我有一个Pandas数据帧,如下所示,必须按Col_2排序: +----+-------+-------+ | id | Col_1 | Col_2 | +----+-------+-------+ | 1 | 0 | 21 | | 1 | 1 | 24 | | 1 | 1 | 32 | | 1 | 0 | 35 | | 1 | 1 | 37 | | 2 | 0 | 2 | | 2 |

我有一个Pandas数据帧,如下所示,必须按Col_2排序:

+----+-------+-------+ 
| id | Col_1 | Col_2 |
+----+-------+-------+
|  1 |     0 |    21 |
|  1 |     1 |    24 |
|  1 |     1 |    32 |
|  1 |     0 |    35 |
|  1 |     1 |    37 |
|  2 |     0 |     2 |
|  2 |     0 |     5 |
+----+-------+-------+
如何创建两个新列:

Col_1_sum:前几行中每个id的值之和。 Col_2_max:Col_1为一的最后一行中Col_2的最大值。(针对每个id)

例如,对于上述数据帧,结果应为:

+----+-------+-------+-----------+-----------+
| id | Col_1 | Col_2 | Col_1_Sum | Col_2_Max |
+----+-------+-------+-----------+-----------+
|  1 |     0 |    21 |         0 |         0 |
|  1 |     1 |    24 |         0 |         0 |
|  1 |     1 |    32 |         1 |        24 |
|  1 |     0 |    35 |         2 |        32 |
|  1 |     1 |    37 |         2 |        32 |
|  2 |     0 |     2 |         0 |         0 |
|  2 |     0 |     5 |         0 |         0 |
+----+-------+-------+-----------+-----------+

你有两个问题。一次一个

第一个问题的答案是
groupby
shift
cumsum

df.groupby('id').Col_1.apply(lambda x: x.shift().cumsum())

0    NaN
1    0.0
2    1.0
3    2.0
4    2.0
5    NaN
6    0.0
Name: Col_1, dtype: float64
或者,如果您喜欢更清洁的输出

df.groupby('id').Col_1.apply(lambda x: x.shift().cumsum()).fillna(0).astype(int)

0    0
1    0
2    1
3    2
4    2
5    0
6    0
Name: Col_1, dtype: int64
第二个也是类似的,使用
groupby
shift
cummax
ffill

df.Col_2.where(df.Col_1.eq(1)).groupby(df.id).apply(
    lambda x: x.shift().cummax().ffill()
)

0     NaN
1     NaN
2    24.0
3    32.0
4    32.0
5     NaN
6     NaN
Name: Col_2, dtype: float64
在这两种情况下,基本成分都是
groupby
,然后是随后的轮班呼叫。请注意,这些答案很难解决,因为需要对子组执行多个操作


考虑通过定义自定义函数来删除lambda。您将在较大的数据上保存几个周期

你有两个问题。一次一个

第一个问题的答案是
groupby
shift
cumsum

df.groupby('id').Col_1.apply(lambda x: x.shift().cumsum())

0    NaN
1    0.0
2    1.0
3    2.0
4    2.0
5    NaN
6    0.0
Name: Col_1, dtype: float64
或者,如果您喜欢更清洁的输出

df.groupby('id').Col_1.apply(lambda x: x.shift().cumsum()).fillna(0).astype(int)

0    0
1    0
2    1
3    2
4    2
5    0
6    0
Name: Col_1, dtype: int64
第二个也是类似的,使用
groupby
shift
cummax
ffill

df.Col_2.where(df.Col_1.eq(1)).groupby(df.id).apply(
    lambda x: x.shift().cummax().ffill()
)

0     NaN
1     NaN
2    24.0
3    32.0
4    32.0
5     NaN
6     NaN
Name: Col_2, dtype: float64
在这两种情况下,基本成分都是
groupby
,然后是随后的轮班呼叫。请注意,这些答案很难解决,因为需要对子组执行多个操作

考虑通过定义自定义函数来删除lambda。您将在较大的数据上保存几个周期