質問内容
以下のようなdfにおいて、集計したときにサンプル数(列数)が40以下になる"Player"(を含む列)に関してはdfから除外するにはどうしたらよいでしょうか?
ご教授の程、よろしくお願い致します。
該当のソースコード
python
1import pandas as pd 2import numpy as np 3pd.options.display.float_format="{:.1f}".format 4#Create a random data frame 5start,end = "2021/4/1","2021/4/30" 6dates = pd.date_range(start=start,end=end,freq="D") 7players = [f"Player{i}"for i in range(1,20)] 8N = 1000 9dates = np.random.choice(dates,size=N) 10dates.sort() 11players=np.random.choice(players,size=N) 12df = pd.DataFrame({ 13 "Date": dates, 14 "Player": players, 15 "Speed": np.random.sample(N) * 100.0, 16 "Angle": np.random.sample(N) * 40.0 - 20.0, 17}) 18#resampling 19dfx = df.groupby("Player").sample(n=40) 20 21#grouping 22dfy = dfx.groupby("Player").agg({ 23 "Player":"count", 24 "Speed":[np.mean], 25 "Angle":[np.mean], 26}) 27print(dfy)
達成したいこと/発生している問題
最終的に、Playerでグルーピングした後に、.agg()にてPlayerごとの各項目の平均値を算出したいと思っています。 サンプル数がPlayerごとに偏りがあるため、算出値の一貫性を担保するためにランダムに40列ずつを抽出したいと考えておりますが、 元からサンプル数が40に満たないPlayerに関しては、 対象から除外したのちにグルーピングしなければと思っております。 #extract random 100 data from each players dfx = df.groupby("Player").sample(n=40) #grouping dfy = dfx.groupby("Player").agg({ "Player":"count", "Speed":[np.mean], "Angle":[np.mean], }) ただし、サンプル数が40に満たないPlayerが存在すると以下のようにエラーが発生します。 あくまで重複は無しで、40に満たないPlayerに関してはあらかじめグルーピングから外す必要があると考えています。 ValueError: Cannot take a larger sample than population when 'replace=False'
補足情報(FW/ツールのバージョンなど)
windows11,python3.9.4,vscode
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/12/16 09:34
2021/12/16 09:36