我有一个数据框,一个:
a=pd.DataFrame({'ID': [1,1,2,2,3,4], 'B': [1,5,3,2,4,1], 'C': [1,4,3,6,1,1]})
ID B C
0 1 1 1
1 1 5 4
2 2 3 3
3 2 2 6
4 3 4 1
5 4 1 1
我想聚合它,以便将生成的新数据帧按ID分组,并返回与B的min对应的行(因此在B上应用min()并按原样携带C。
因此,结果数据帧应为:
ID B C
0 1 1 1
1 2 2 6
2 3 4 1
3 4 1 1
如何使用pandas.groupby()
以编程方式执行此操作,或者还有另一种方法?
答案 0 :(得分:2)
您可以使用groupby并进行转换以过滤行
a.loc[a['B'] == a.groupby('ID').B.transform('min')]
B C ID
0 1 1 1
3 2 6 2
4 4 1 3
5 1 1 4
答案 1 :(得分:0)
尝试在groupby
之前进行排序,然后再进行first
:
a.sort_values('B').groupby('ID',as_index=False).first()
ID B C
0 1 1 1
1 2 2 6
2 3 4 1
3 4 1 1
或者,可能更快的方法是按ID
和B
进行排序,然后删除重复的ID
,保留第一个(这是{{ 1}}):
drop_duplicates
答案 2 :(得分:0)
当涉及排序时,并且分组不涉及任何计算时,我更喜欢对基础numpy
数组进行处理以提高性能。
使用argsort
和numpy.unique
:
arr = a.values
out = arr[np.argsort(arr[:, 1])]
_, idx = np.unique(out[:, 0], return_index=True)
out[idx]
array([[1, 1, 1],
[2, 2, 6],
[3, 4, 1],
[4, 1, 1]], dtype=int64)
要将值重新分配给您的DataFrame:
pd.DataFrame(out[idx], columns=a.columns)
ID B C
0 1 1 1
1 2 2 6
2 3 4 1
3 4 1 1