私は次のようなpandasデータフレームを持っています:
_ 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()
を使用してみましたが、奇妙な結果が得られました。最初の175行はmin列に入力されましたが、残りはすべてNaNに送られました。それはあなたがgroupbyメソッドを使用することになっている方法ではありませんか?
オプション1transform
を使用
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結合と集計を使用する
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
オプションマージと集計を使用
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
ゴツゴツしたシェナニガンと
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