我有一个熊猫数据框,如下所示:
c y
0 9 0
1 8 0
2 3 1
3 6 2
4 1 3
5 2 3
6 5 3
7 4 4
8 0 4
9 7 4
我想对y
进行分组,并获得c
的最小值和最大值,以便我的新数据框看起来像这样:
c y min max
0 9 0 8 9
1 8 0 8 9
2 3 1 3 3
3 6 2 6 6
4 1 3 1 5
5 2 3 1 5
6 5 3 1 5
7 4 4 0 7
8 0 4 0 7
9 7 4 0 7
我尝试使用df['min'] = df.groupby(['y'])['c'].min()
,但这给了我一些奇怪的结果。在min列中填充了前175行,但其余所有行都转到了NaN。那不是应该如何使用groupby方法吗?
答案 0 :(得分:7)
选项1 使用transform
In [13]: dfc = df.groupby('y')['c']
In [14]: df.assign(min=dfc.transform(min), max=dfc.transform(max))
Out[14]:
c y max min
0 9 0 9 8
1 8 0 9 8
2 3 1 3 3
3 6 2 6 6
4 1 3 5 1
5 2 3 5 1
6 5 3 5 1
7 4 4 7 0
8 0 4 7 0
9 7 4 7 0
或
In [15]: df['min' ] = dfc.transform('min')
In [16]: df['max' ] = dfc.transform('max')
选项2 使用join和agg
In [30]: df.join(df.groupby('y')['c'].agg(['min', 'max']), on='y')
Out[30]:
c y min max
0 9 0 8 9
1 8 0 8 9
2 3 1 3 3
3 6 2 6 6
4 1 3 1 5
5 2 3 1 5
6 5 3 1 5
7 4 4 0 7
8 0 4 0 7
9 7 4 0 7
选项3 使用合并和汇总
In [28]: df.merge(df.groupby('y')['c'].agg(['min', 'max']), right_index=True, left_on='y')
Out[28]:
c y min max
0 9 0 8 9
1 8 0 8 9
2 3 1 3 3
3 6 2 6 6
4 1 3 1 5
5 2 3 1 5
6 5 3 1 5
7 4 4 0 7
8 0 4 0 7
9 7 4 0 7
答案 1 :(得分:3)
带有顽皮的恶作剧
n = df.y.max() + 1
omax = np.ones(n, df.c.values.dtype) * df.c.values.min()
omin = np.ones(n, df.c.values.dtype) * df.c.values.max()
np.maximum.at(omax, df.y.values, df.c.values)
np.minimum.at(omin, df.y.values, df.c.values)
df.assign(min=omin[df.y], max=omax[df.y])
c y min max
0 9 0 8 9
1 8 0 8 9
2 3 1 3 3
3 6 2 6 6
4 1 3 1 5
5 2 3 1 5
6 5 3 1 5
7 4 4 0 7
8 0 4 0 7
9 7 4 0 7