熊猫在保持列不变的情况下聚合数据

时间:2018-09-28 19:31:49

标签: python python-3.x pandas

我有一个数据框,一个:

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()以编程方式执行此操作,或者还有另一种方法?

3 个答案:

答案 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

或者,可能更快的方法是按IDB进行排序,然后删除重复的ID,保留第一个(这是{{ 1}}):

drop_duplicates

答案 2 :(得分:0)

当涉及排序时,并且分组不涉及任何计算时,我更喜欢对基础numpy数组进行处理以提高性能。


使用argsortnumpy.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