根据熊猫中每个已排序组的第一行创建一列

时间:2019-09-29 13:38:56

标签: python python-3.x pandas pandas-groupby

我想基于两列对数据框进行分组,然后根据另一列对每个组进行排序,然后根据每个组的第一行为每个组创建新列!(col3是我的数据集中的日期)

数据框:

col1            col2         col3
A               0            2.0
A               0            1.0
A               0            3.0
A               1            3.0
A               1            4.0
B               0            3.0
B               0            1.0
B               1            1.0
B               1            1.0

输出:

col1            col2         col3           col4
A               0            2.0        1.0
A               0            1.0        1.0
A               0            3.0        1.0
A               1            3.0        3.0
A               1            4.0        3.0
B               0            3.0        1.0
B               0            1.0        1.0
B               1            0.0        0.0
B               1            1.0        0.0

我尝试过这个:

active_users = active_users.groupby(['col1', 'col2']).apply(lambda x: x.sort_values('col3')).transform('first')

并收到此错误:

TypeError: first() missing 1 required positional argument: 'offset'

1 个答案:

答案 0 :(得分:2)

您可以使用以下方法创建此类列:

df['col4'] = df.groupby(['col1', 'col2'])['col3'].transform('min')

由于已排序项目的第一个值是最小值。通常最好在已排序列表的第一项上使用最小值,因为可以在 O(n)中完成最小值的计算。对于排序,它取决于算法本身,因为有些懒惰的排序算法有时也可以获取 O(n)中的第一个元素,但是我认为'min'可以更清楚地说明什么你打算去做。

对于给定的示例数据框,我们将获得:

>>> df = pd.DataFrame({'col1': ['A']*5 + ['B']*4, 'col2': [0,0,0,1,1,0,0,1,1], 'col3': [2,1,3,3,4,3,1,0,1.0]})
>>> df
  col1  col2  col3
0    A     0   2.0
1    A     0   1.0
2    A     0   3.0
3    A     1   3.0
4    A     1   4.0
5    B     0   3.0
6    B     0   1.0
7    B     1   0.0
8    B     1   1.0
>>> df['col4'] = df.groupby(['col1', 'col2'])['col3'].transform('min')
>>> df
  col1  col2  col3  col4
0    A     0   2.0   1.0
1    A     0   1.0   1.0
2    A     0   3.0   1.0
3    A     1   3.0   3.0
4    A     1   4.0   3.0
5    B     0   3.0   1.0
6    B     0   1.0   1.0
7    B     1   0.0   0.0
8    B     1   1.0   0.0