Python Pandas DataFrameで各グループの最大のものを選択するにはどうすればよいですか?
はじめに
データ分析中に実行する最も基本的で一般的な操作の1つは、グループ内のいくつかの列の最大値を含む行を選択することです。この投稿では、DataFrame内の各グループの最大のものを見つける方法を紹介します。
問題..
最初にタスクを理解しましょう。映画のデータセットが与えられ、人気に基づいて毎年最も人気のある映画をリストするように要求されたと仮定します。
その方法..
1.データの準備。
グーグルはデータセットでいっぱいです。私はよくkaggle.comを使用して、データ分析に必要なデータセットを取得します。 kaggle.comにログインして、映画を検索してください。映画のデータセットをディレクトリにダウンロードし、PandasDataFrameにインポートします。
私と同じようにkaggle.comからデータをダウンロードした場合は、データを手伝ってくれた人のようにしてください。
import pandas as pd import numpy as np movies = pd.read_csv("https://raw.githubusercontent.com/sasankac/TestDataSet/master/movies_data.csv")としてインポートします。
# see sample 5 rows print(f"Output \n\n*** {movies.sample(n=5)} ")
出力
*** budget id original_language original_title popularity \ 2028 22000000 235260 en Son of God 9.175762 2548 0 13411 en Malibu's Most Wanted 7.314796 3279 8000000 26306 en Prefontaine 8.717235 3627 5000000 10217 en The Sweet Hereafter 7.673124 4555 0 98568 en Enter Nowhere 3.637857 release_date revenue runtime status title \ 2028 28/02/2014 67800064 138.0 Released Son of God 2548 10/04/2003 0 86.0 Released Malibu's Most Wanted 3279 24/01/1997 589304 106.0 Released Prefontaine 3627 14/05/1997 3263585 112.0 Released The Sweet Hereafter 4555 22/10/2011 0 90.0 Released Enter Nowhere vote_average vote_count 2028 5.9 83 2548 4.7 77 3279 6.7 21 3627 6.8 103 4555 6.5 49
2.データを理解するために、いくつかの基本的なデータ分析を実行します。
# Identify the data-types print(f"Output \n*** Datatypes are {movies.dtypes} ")
出力
*** Datatypes are budget int64 id int64 original_language object original_title object popularity float64 release_date object revenue int64 runtime float64 status object title object vote_average float64 vote_count int64 dtype: object
2.これで、大量のメモリ使用量を節約したい場合は、float64とint64のデータ型を変換できます。ただし、データ型を変換する前に、注意して宿題をする必要があります。
# Check the maximum numeric value. print(f"Output \n *** maximum value for Numeric data type - {movies.select_dtypes(exclude=['object']).unstack().max()}") # what is the max vote count value print(f" *** Vote count maximum value - {movies[['vote_count']].unstack().max()}") # what is the max movie runtime value print(f" *** Movie Id maximum value - {movies[['runtime']].unstack().max()}")
出力
*** maximum value for Numeric data type - 2787965087.0 *** Vote count maximum value - 13752 *** Movie Id maximum value - 338.0
3. 64ビットで表す必要がなく、16ビットに下げることができる列があるので、やってみましょう。 64ビット整数の範囲は-32768〜+32767です。私はvote_countとruntimeに対してそれを行い、より少ないメモリストレージを必要とする列に対してそれを行うことができます。
4.ここで、毎年最も人気のある映画を特定するには、release_dateでグループ化し、人気の最大値を取得する必要があります。典型的なSQLは次のようになります。
SELECT movie with max popularity FROM movies GROUP BY movie released year
5.残念ながら、release_dateはオブジェクトデータ型であり、それらを日時に変換する方法はいくつかあります。グループ化にその列を使用できるように、年だけで新しい列を作成することを選択します。
movies['year'] = pd.to_datetime(movies['release_date']).dt.year.astype('Int64') print(f"Output \n ***{movies.sample(n=5)}")
出力
*** budget id original_language original_title popularity \ 757 0 87825 en Trouble with the Curve 18.587114 711 58000000 39514 en RED 41.430245 1945 13500000 152742 en La migliore offerta 30.058263 2763 13000000 16406 en Dick 4.742537 4595 350000 764 en The Evil Dead 35.037625 release_date revenue runtime status title \ 757 21/09/2012 0 111.0 Released Trouble with the Curve 711 13/10/2010 71664962 111.0 Released RED 1945 1/01/2013 19255873 124.0 Released The Best Offer 2763 4/08/1999 27500000 94.0 Released Dick 4595 15/10/1981 29400000 85.0 Released The Evil Dead vote_average vote_count year 757 6.6 366 2012 711 6.6 2808 2010 1945 7.7 704 2013 2763 5.7 67 1999 4595 7.3 894 1981
方法1-GroupByを使用しない
6.必要なのは、映画のタイトル、映画のリリース年、人気の3つの列だけです。したがって、これらの列を選択し、年にsort_valuesを使用して、結果がどのようになるかを確認します。
print(f"Output \n *** Method 1- Without Using Group By") movies[["title", "year", "popularity"]].sort_values("year", ascending=True)
出力
*** Without Using Group By
| タイトル | 年 | 人気 |
---|---|---|---|
4592 | 不寛容 | 1916 | 3.232447 |
4661 | ビッグパレード | 1925 | 0.785744 |
2638 | メトロポリス | 1927 | 32.351527 |
4594 | ブロードウェイメロディー | 1929 | 0.968865 |
4457 | パンドラの箱 | 1929 | 1.824184 |
... | ... | ... | ... |
2109 | 私はあなたの前に | 2016 | 53.161905 |
3081 | 森 | 2016 | 19.865989 |
2288 | ファイトバレー | 2016 | 1.224105 |
4255 | 成長するスミス | 2017 | 0.710870 |
4553 | アメリカはまだ場所です | | 0.000000 |
4803行×3列
8.結果を見て、1年で最も人気のある映画を取得するには、人気も並べ替える必要があります。対象の列をリストとして渡します。 ascending =Falseの場合、並べ替えの結果は降順になります。
movies[["title", "year", "popularity"]].sort_values(["year","popularity"], ascending=False)
| タイトル | 年 | 人気 |
---|---|---|---|
4255 | 成長するスミス | 2017 | 0.710870 |
788 | デッドプール | 2016 | 514.569956 |
26 | キャプテンアメリカ:シビルウォー | 2016 | 198.372395 |
10 | バットマンvsスーパーマンジャスティスの誕生 | 2016 | 155.790452 |
64 | X-メン:黙示録 | 2016 | 139.272042 |
... | ... | ... | ... |
4593 | ブロードウェイメロディー | 1929 | 0.968865 |
2638 | メトロポリス | 1927 | 32.351527 |
4660 | ビッグパレード | 1925 | 0.785744 |
4591 | 不寛容 | 1916 | 3.232447 |
4552 | アメリカはまだ場所です | | 0.000000 |
4802行×3列
9.了解しました。これで、データは完全に並べ替えられました。したがって、次のステップは、各年の最初の値を保持し、残りを削除することです。それを行う方法を推測しますか?。
.drop_duplicatesメソッドを使用します。
movies[["title", "year", "popularity"]].sort_values(["year","popularity"], ascending=False).drop_duplicates(subset="year")
| タイトル | 年 | 人気 |
---|---|---|---|
4255 | 成長するスミス | 2017 | 0.710870 |
788 | デッドプール | 2016 | 514.569956 |
546 | ミニオン | 2015 | 875.581305 |
95 | 星間 | 2014 | 724.247784 |
124 | 冷凍 | 2013 | 165.125366 |
... | ... | ... | ... |
4456 | パンドラの箱 | 1929 | 1.824184 |
2638 | メトロポリス | 1927 | 32.351527 |
4660 | ビッグパレード | 1925 | 0.785744 |
4591 | 不寛容 | 1916 | 3.232447 |
4552 | アメリカはまだ場所です | | 0.000000 |
91行×3列
groupbyでも同じことができます。このアプローチは、上記のSQLと非常によく似ています。
print(f"Output \n *** Method 2 - Using Group By") movies[["title", "year", "popularity"]].groupby("year", as_index=False).apply(lambda df:df.sort_values("popularity", ascending=False) .head(1)).droplevel(0).sort_values("year", ascending=False)
出力
*** Method 2 - Using Group By
| タイトル | 年 | 人気 |
---|---|---|---|
4255 | 成長するスミス | 2017 | 0.710870 |
788 | デッドプール | 2016 | 514.569956 |
546 | ミニオン | 2015 | 875.581305 |
95 | 星間 | 2014 | 724.247784 |
124 | 冷凍 | 2013 | 165.125366 |
... | ... | ... | ... |
3804 | ヘルズエンジェルス | 1930 | 8.484123 |
4457 | パンドラの箱 | 1929 | 1.824184 |
2638 | メトロポリス | 1927 | 32.351527 |
4661 | ビッグパレード | 1925 | 0.785744 |
4592 | 不寛容 | 1916 | 3.232447 |
90行×3列
-
Python-PandasDataFrameからnull行を削除する方法
Pandas DataFrameのnull行を削除するには、dropna()メソッドを使用します。以下が、いくつかのNaN、つまりnull値を含むCSVファイルであるとしましょう- read_csv()を使用してCSVファイルを読み取ってみましょう。 CSVはデスクトップにあります- dataFrame = pd.read_csv("C:\\Users\\amit_\\Desktop\\CarRecords.csv") dropna()-を使用してnull値を削除します dataFrame = dataFrame.dropna() 例 以下は完全なコードです-
-
Python Pandasでデータフレーム列の値をX軸ラベルとして設定するにはどうすればよいですか?
Python Pandasでデータフレーム列の値をX軸ラベルとして設定するには、 xticksを使用できます。 plot()の引数で メソッド。 ステップ 図のサイズを設定し、サブプロット間およびサブプロットの周囲のパディングを調整します。 column1キーのパンダを使用してデータフレームを作成します 。 plot()を使用してPandasデータフレームをプロットします X軸の列としてcolumn1を使用するメソッド。 図を表示するには、 show()を使用します メソッド。 例 import pandas as pd from matplotlib impo