Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫聚集数据时,列保持不变_Python_Python 3.x_Pandas - Fatal编程技术网

Python 熊猫聚集数据时,列保持不变

Python 熊猫聚集数据时,列保持不变,python,python-3.x,pandas,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) 因此,生成的数据帧应为:

我有一个数据框,一个:

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()以编程方式执行此操作,或者是否有其他方法执行此操作?

尝试在您的
groupby
之前进行排序,然后先执行

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
s,保留第一个(这是
drop\u duplicates
的默认行为):


当涉及到排序,并且分组不涉及任何计算时,我更喜欢使用底层的
numpy
数组来提高性能


使用
argsort
numpy.unique

arr = a.values
out = arr[np.argsort(arr[:, 1])]
_, idx = np.unique(out[:, 0], return_index=True)

out[idx]

要将值重新分配给数据帧,请执行以下操作:

pd.DataFrame(out[idx], columns=a.columns)


可以使用groupby和transform筛选行

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