如何通过聚合DataFrame中另一列的简单值来添加最小值?

时间:2018-02-11 22:41:52

标签: python pandas

在下面的Pandas DataFrame中,我想进行聚合计算(最小值),同时只需添加另一列中的值。我能够解决这个问题,但我怀疑gb.agg内有一个更简单的解决方案。

import numpy as np
import pandas as pd

df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'], 'B' : ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'], 'C' : np.random.randn(8), 'D' : np.random.randn(8)})

这可能会提供类似以下DataFrame的内容:

  A   B    C     D
0 foo one 0.229 0.902
1 bar one 0.594 1.917
2 foo two -0.913 2.444
3 bar three -0.628 -0.902
4 foo two -0.223 -1.063
5 bar two -0.223 0.311
6 foo one -0.592 0.964
7 foo three 0.869 0.817

如何添加D只是因为它与min位于同一行。 C汇总?

更详细地说,对于这两个群体来说,' foo'和' bar' C的最小值是我的目标是它同时需要列D的相应行中的数据。注意我想要的是df.groupby('A').min(),它将返回每列的最小值类别。

可能的解决方案是:

ndf = df.groupby('A').agg({'C': {'Cmin': np.min}}).reset_index()
ndf.columns = ['A', 'C']
pd.merge(ndf, df.loc[:,['A','C','D']], how='left', on=['A','C'])

结果是:

   A   C     D
0 bar -0.628 -0.902
1 foo -0.913 2.444

但是我想知道在 Python 3 中是否有更优雅的东西可以直接在groupby.agg中使用?

1 个答案:

答案 0 :(得分:1)

这应该有效。我们使用idxmin按组检索列最小值的索引值,然后通过iloc使用此索引。最后,您可以删除任何不需要的列。

df.iloc[df.groupby('A')['C'].agg(pd.Series.idxmin)].drop('B', 1)