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

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

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

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

pandas

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

Q&A

解決済

3回答

989閲覧

特定の日付から前半/後半の2つに分けて集計したい。

8960

総合スコア108

Python

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

pandas

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

0グッド

0クリップ

投稿2021/11/14 06:38

前提・実現したいこと

Python初心者です。pandas等を用いて一つのexcelファイルからデータ分析をしています。
ある特定の日付からそれ以前をfirst_half、それ以降をsecond_halfのようにしてそれぞれ集計したいです(下記の例でいえば2021-08-01より前をfirst_half、以後をsecond_half)。
なお集計後に出力する値はsumやmean、max、minです。agg()を使用しようと考えています。

どうすればよいでしょうか?

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

該当のソースコード

python

1df = pd.DataFrame({ 2 "Date": pd.date_range(start='2021/4/1', periods=100, freq='D'), 3 "Player": [f'Player {i}' for i in np.random.randint(1, 6, 100)], 4 "Speed": np.random.sample(100) * 100.0, 5 "Angle": np.random.sample(100) * 40.0 - 20.0, 6 "Efficiency": np.random.sample(100) * 100.0,

試したこと

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

python,vscode

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

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

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

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

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

melian

2021/11/14 07:13

前回の質問に対する回答を参考にして下さい。
8960

2021/11/14 07:30

前回もご回答いただきありがとうございました。 前回回答いただいたものをもとに試してみてはいるのですが、「特定の日付で区分(集計)」という作業がどうにもできません…。.groupby()や.agg()をつかってみてはいますが、ここに特定の日付基準で区分して集計を+することができません。
meg_

2021/11/14 07:49

データフレームを2つに分けて集計してみてはどうでしょうか?(まずは簡単な方法から実装するのは有りだと思います)
8960

2021/11/15 01:54

ご回答いただきありがとうございます。 ご提案いただいた通り、2つに分けて集計するとできました。 ありがとうございました。
guest

回答3

0

投稿2021/11/14 06:55

ppaul

総合スコア24670

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

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

8960

2021/11/14 07:26

ご回答いただきありがとうございます。 読みましたがどうも…。 .groupby()や.agg()はよく使いますので理解できるのですが、特定の日付で区分という作業がどうにもできません。週や四半世紀といったわかりやすい区分だと良かったのですが。
guest

0

ベストアンサー

groupby()や.agg()はよく使いますので理解できるのですが、

groupby() を使うなら、df.groupby(df['Date'] >= '2021-08-01') となるでしょう。

python

1import pandas as pd 2import numpy as np 3 4N = 60 5df = pd.DataFrame({ 6 "Date": pd.date_range(start='2021/7/1', periods=N, freq='D'), 7 "Player": [f'Player {i}' for i in np.random.randint(1, 6, N)], 8 "Speed": np.random.sample(N) * 100.0, 9 "Angle": np.random.sample(N) * 40.0 - 20.0, 10 "Efficiency": np.random.sample(N) * 100.0, 11}) 12 13print(df.head(), '\n', df.tail()) 14 15_ = ''' 16 Date Player Speed Angle Efficiency 170 2021-07-01 Player 5 19.424221 10.398202 26.556917 181 2021-07-02 Player 4 19.584696 6.788205 69.426798 192 2021-07-03 Player 1 99.390299 16.283226 81.342796 203 2021-07-04 Player 5 41.540630 -4.641508 32.071403 214 2021-07-05 Player 1 44.272788 6.083881 76.182775 22 23 Date Player Speed Angle Efficiency 2455 2021-08-25 Player 3 33.155351 19.529361 99.201132 2556 2021-08-26 Player 3 21.561071 13.919872 19.584945 2657 2021-08-27 Player 3 21.030010 -15.227838 67.279885 2758 2021-08-28 Player 3 5.028648 -6.847735 70.794531 2859 2021-08-29 Player 2 35.603358 -11.656739 99.720992 29''' 30 31# split to two dataframes 32sep_date = '2021-08-01' 33first_half, second_half = [ 34 pd.DataFrame(f) for _, f in df.groupby(df['Date'] >= sep_date)] 35 36 37print(first_half.head(), '\n', first_half.tail()) 38 39_ = ''' 40 Date Player Speed Angle Efficiency 410 2021-07-01 Player 5 19.424221 10.398202 26.556917 421 2021-07-02 Player 4 19.584696 6.788205 69.426798 432 2021-07-03 Player 1 99.390299 16.283226 81.342796 443 2021-07-04 Player 5 41.540630 -4.641508 32.071403 454 2021-07-05 Player 1 44.272788 6.083881 76.182775 46 47 Date Player Speed Angle Efficiency 4826 2021-07-27 Player 3 66.456286 1.561090 31.683482 4927 2021-07-28 Player 1 6.832737 14.446787 14.163490 5028 2021-07-29 Player 1 51.565821 -19.700863 79.727559 5129 2021-07-30 Player 2 85.230726 11.855018 35.503564 5230 2021-07-31 Player 3 98.261812 -10.599585 72.857861 53''' 54 55print(second_half.head(), '\n', second_half.tail()) 56 57_ = ''' 58 Date Player Speed Angle Efficiency 5931 2021-08-01 Player 3 58.559183 -7.192560 74.589404 6032 2021-08-02 Player 5 41.987566 -14.270427 69.006067 6133 2021-08-03 Player 3 42.610050 -15.104464 80.391799 6234 2021-08-04 Player 3 90.539195 8.055154 87.525425 6335 2021-08-05 Player 4 0.329127 18.792771 74.861874 64 65 Date Player Speed Angle Efficiency 6655 2021-08-25 Player 3 33.155351 19.529361 99.201132 6756 2021-08-26 Player 3 21.561071 13.919872 19.584945 6857 2021-08-27 Player 3 21.030010 -15.227838 67.279885 6958 2021-08-28 Player 3 5.028648 -6.847735 70.794531 7059 2021-08-29 Player 2 35.603358 -11.656739 99.720992 71'''

投稿2021/11/14 10:36

編集2021/11/14 10:44
melian

総合スコア20655

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

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

8960

2021/11/15 02:12

ご回答いただきありがとうございます。 基本的には「データフレームを二つに分割する」という作業が必要のようですね。 参考にさせていただきました!
guest

0

下記の例でいえば2021-08-01より前をfirst_half、以後をsecond_half

とありますが

"Date": pd.date_range(start='2021/4/1', periods=100, freq='D')

では、2021-08-01は含まれていないのではないでしょうか?

.groupby()や.agg()はよく使いますので理解できるのですが、特定の日付で区分という作業がどうにもできません。

特定の日付(2021-06-01)で区分する例です。

Python

1df_first_half = df[df['Date'] < '2021/6/1'] # or '2021-06-01' 2df_second_half = df[df['Date'] >= '2021/6/1'] # or pd.Timestamp(2021, 6, 1)

投稿2021/11/14 09:57

lehshell

総合スコア1156

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

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

8960

2021/11/15 01:55

参考にさせていただきました。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問