在下面的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中使用?
答案 0 :(得分:1)
这应该有效。我们使用idxmin
按组检索列最小值的索引值,然后通过iloc
使用此索引。最后,您可以删除任何不需要的列。
df.iloc[df.groupby('A')['C'].agg(pd.Series.idxmin)].drop('B', 1)