web-dev-qa-db-ja.com

pandas groupbyここで、1つの列の最大値と別の列の最小値を取得します

次のようなデータフレームがあります。

user    num1    num2
a       1       1
a       2       2
a       3       3
b       4       4
b       5       5

各ユーザーのnum1からの最小値と各ユーザーの最大のnum2を持つデータフレームが必要です。

出力は次のようになります。

user    num1    num2
a       1       3
b       4       5

両方の列の最大値が必要な場合は、次のようにすることができます:

a.groupby('user')['num1', 'num2'].max()

次のようなことをする必要のない同等のものはありますか?

series_1 = a.groupby('user')['num1'].min() 
series_2 = a.groupby('user')['num2'].max()

# converting from series to df so I can do a join on user
df_1 = pd.DataFrame(np.array([series_1]).transpose(), index=series_1.index, columns=['num1']) 
df_2 = pd.DataFrame(np.array([series_2]).transpose(), index=series_2.index, columns=['num2'])

df_1.join(df_2)
10
lhay86

groupby + agg by dictを使用するので、subsetまたは reindex_axis 。最後に追加 reset_index 必要に応じて、indexcolumnに変換します。

df = a.groupby('user').agg({'num1':'min', 'num2':'max'})[['num1','num2']].reset_index()
print (df)
  user  num1  num2
0    a     1     3
1    b     4     5

以下と同じです:

df = a.groupby('user').agg({'num1':'min', 'num2':'max'})
                      .reindex_axis(['num1','num2'], axis=1)
                      .reset_index()
print (df)
  user  num1  num2
0    a     1     3
1    b     4     5
10
jezrael