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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

473閲覧

agg()で指定した値を必要な個所にのみ適用したい。

8960

総合スコア108

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2021/11/07 07:06

編集2021/11/07 07:23

前提・実現したいこと

Python初心者です。特定の.xlsxファイルや.csvファイルを用いてpandasよりデータ分析を行っております。

”Player”列やそのPlayerの各分野の成績などが一行に並んだ.xlsxファイルを大元に分析を行っております(1Playerは1行のみではなく、日付ごとに複数の行をランダムに持っています)。
Playerごとに各カラムにおけるcount値やmean値やmax値などデフォルトで計算できるものを計算させ、Playerでグルーピングしたものを成績表として別のxlsxに書き出します。

percentile値や指定範囲の割合に関しては、関数を定義して使用しています。

出力する値はagg()でまとめて書き出す仕様になっております。
現状では全カラムに対してaggで指定したものが出てきてしまっていますが、countはPlayerの右隣に一行のみ、percentile値はSpeedの最左端のみに挿入したいです。

また、Angleに関してはそのPlayerの全体の数に対して4~16である割合を関数を作成しaggに入れております。これに関してもAngle列の右端にのみ挿入したいと考えております。

拙い説明でございますが、どのように行うのが良いでしょうか?
ご教授の程、よろしくお願い致します。

発生している問題・エラーメッセージ

該当のソースコード

Python

1import pandas as pd 2import numpy as np 3import openpyxl as px 4pd.options.display.float_format="{:.1f}".format 5df = pd.read_excel("sample.xlsx") 6df = df[["Date","Player","Speed","Angle","Efficiency"]] 7 8def percentile(n): 9 def percentile_(x): 10 return np.percentile(x, n) 11 percentile_.__name__ = '%sth' % n 12 return percentile_ 13 14def AA416(angle): 15 return 100*angle[(angle>=4.0)&(angle<16.0)].count()/angle.count() 16 17dfx = df.groupby("Player").agg(["count",np.mean,max,np.std,percentile(50),percentile(90),AA416])

試したこと

初心者の極みでございますので、色々と調べながらここまで書けてやっとという感覚です...。
そもそもagg()で指定してしまうと、やはり全カラムに適用されてしまうので複数回に分けて書き出す+書き出したものを結合させる、のが一つの方法なのかなとは思っておりました。
Angleに関しては当初はその考えで、別ファイルで書き出していましたがやはり結合させるのに手間があるなと感じたため質問致しました。

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

vscode、python3.9.4

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

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

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

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

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

1T2R3M4

2021/11/07 07:10

調べたこと、試したことを質問に追記していただけませんか。
8960

2021/11/07 07:24

調べながらここまでたどり着き、手詰まり、、、という感覚です。 試したこと欄に追記致しました。 よろしくお願い致します。
guest

回答1

0

ベストアンサー

agg() に辞書を渡します(表示が多少ずれていますが、、)。

python

1import pandas as pd 2import numpy as np 3 4pd.options.display.float_format="{:.1f}".format 5 6# dataframe for testing 7df = pd.DataFrame({ 8 "Date": pd.date_range(start='2021/1/1', periods=100, freq='D'), 9 "Player": [f'Player {i}' for i in np.random.randint(1, 6, 100)], 10 "Speed": np.random.sample(100) * 100.0, 11 "Angle": np.random.sample(100) * 40.0 - 20.0, 12 "Efficiency": np.random.sample(100) * 100.0, 13}) 14 15def percentile(n): 16 def percentile_(x): 17 return np.percentile(x, n) 18 percentile_.__name__ = '%sth' % n 19 return percentile_ 20 21def AA4_16(angle): 22 return 100*angle[(angle>=4.0)&(angle<16.0)].count()/angle.count() 23 24dfx = df.groupby("Player").agg({ 25 "Player": "count", 26 "Speed": [percentile(50), percentile(90), np.mean, np.max, np.std], 27 "Angle": [np.mean, np.max, np.std, AA4_16], 28 "Efficiency": [np.mean, np.max, np.std], 29}) 30 31print(dfx) 32 33# 34 Player Speed Angle Efficiency 35 count 50th 90th mean amax std mean amax std AA4_16 mean amax std 36Player 37Player 1 15 38.6 89.3 45.8 98.1 36.3 -0.2 18.9 12.1 33.3 44.0 96.9 22.8 38Player 2 22 52.0 88.9 52.0 95.7 28.8 5.0 19.2 9.3 40.9 60.3 98.3 28.5 39Player 3 21 55.5 80.8 54.1 96.8 22.9 -2.5 17.0 11.4 33.3 52.4 97.5 30.2 40Player 4 23 36.6 71.4 36.1 87.6 27.5 -2.2 17.5 9.8 21.7 46.5 90.2 27.1 41Player 5 19 51.3 96.1 49.3 99.8 34.0 -1.4 16.2 12.8 36.8 34.5 90.3 31.1

投稿2021/11/07 09:35

melian

総合スコア19798

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問