我想基于两列对数据框进行分组,然后根据另一列对每个组进行排序,然后根据每个组的第一行为每个组创建新列!(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'
答案 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