質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

445閲覧

groupby 上から3番目の値の取り方

yamato0565

総合スコア17

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2023/05/27 23:48

実現したいこと

groupbyした際に上から3番目の列を取得したい

該当のソースコード

python

1import pandas as pd 2df=[['a',1],['a',2],['a',3],['a',5],['b',4],['b',8]] 3df=pd.DataFrame(df) 4df=df.rename(columns={0:'product',1:'price'})

試したこと

df_gr= df.groupby('product').head(3)
df_gr= df_gr.groupby('product').tail(1)

このやり方だと'product'.'b'にはデータがないのでNaNが入ってほしいが
上から2番目の列を取り出してしまう

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2023/05/28 01:19

> groupbyした際に上から3番目の列を取得したい 「上から3番目の列」とは何のことでしょうか?列ではなく行の意味でしょうか? 質問のコードの例ですと欲しい結果は何になりますか?
yamato0565

2023/05/28 01:51

すいません 行のことです 質問の行だと 'product'.'a'はgroupbyした際の上から3番目の行で priceが3の行で product'bは上から3番目の行データがないので 欠損値などにしたいです
guest

回答2

0

ベストアンサー

python

1import pandas as pd 2import numpy as np 3 4df=[['a',1],['a',2],['a',3],['a',5],['b',4],['b',8]] 5df=pd.DataFrame(df) 6df=df.rename(columns={0:'product',1:'price'}) 7 8# 9N = 3 10df_gr = df.groupby('product').head(N).groupby('product')\ 11 .agg({'price': lambda x: x.tail(1) if len(x) >= N else np.nan})\ 12 .reset_index() 13 14print(df_gr) 15 16# product price 17# 0 a 3.0 18# 1 b NaN

投稿2023/05/28 04:45

編集2023/05/28 04:53
melian

総合スコア19712

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

'product'.'b'にはデータがないのでNaNが入ってほしい

後から追加する方法のコードです。

Python

1import pandas as pd 2import numpy as np 3 4df=[['a',1],['a',2],['a',3],['a',5],['b',4],['b',8]] 5df=pd.DataFrame(df) 6df=df.rename(columns={0:'product',1:'price'}) 7 8result = df.groupby('product').nth(2).reset_index() 9for i in df['product'].unique(): 10 if not i in result['product'].array: 11 result = pd.concat([result, pd.DataFrame({'product':[i], 'price':[np.nan]})]) 12result = result.reset_index(drop=True) 13print(result) 14# product price 15# 0 a 3.0 16# 1 b NaN

投稿2023/05/28 03:24

meg_

総合スコア10579

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yamato0565

2023/05/29 05:22

回答ありがとうございます うまく行くことができました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問