Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

【小ネタ】python dataframe カテゴリごとの集約データがない場合に生成して、カテゴリごとの昇順でソートする

More than 1 year has passed since last update.

下記のようなデータフレーム(df)があった場合に

都市 人口 GDP
日本 東京 100 100
日本 大阪 80 95
日本 横浜 50 90
日本 福岡 60 93
フランス パリ 50 90
フランス リオン 30 80
フランス マルセイユ 45 55
イギリス ロンドン 80 85
イギリス マンチェスター 55 50

下記のように国ごとの人口、GDPの集約値列をつくり、人口が多い国順でかつ人口が多い都市順に並び替えるには?

都市 人口 GDP 国人口 国GDP
日本 東京 100 100 290 378
日本 大阪 80 95 290 378
日本 横浜 50 90 290 378
日本 福岡 60 93 290 378
フランス パリ 50 90 125 225
フランス リオン 30 80 125 225
フランス マルセイユ 45 55 125 225
イギリス ロンドン 80 85 135 135
イギリス マンチェスター 55 50 135 135
for _,df2 in df.groupby("国"):
     df.loc[df2.index,"国人口"] = df2["人口"].sum()

#df.groupb("国")の状態(つまりdf2の状態)は indexは元々のdfのままの国ごとのタプル(注意:集計するまではindexは元々のdfのまま)。
#なので、df.loc[df2.index,"国人口"]とすれば、dfに"国人口"という列をつくって、対応する箇所に好きな値を入れられる
#入れる値はdf2["人口"].sum() つまり特定の国だけの人口をsumした値
#以下、GDPについても繰り返す

for _,df2 in df.groupby("国"):
    df.loc[df2.index,"国GDP"] = df2["GDP"].sum()

文字列と数字が混在するソートだが、

文字と数字で両方ソートしたい場合

以下、国と都市のカテゴリカルデータ(文字列)列、人口とGDPの数字データ列があるdfの場合

人口が多い国順を第一優先にして、同じ国の中でGDPが多い都市順に並べたい場合は
df = df.sort_values(["国人口","国","GDP","都市"],ascending=False)
GDPが多い国順を第一優先にして、同じ国の中で人口が多い都市順に並べたい場合は
dfs2.sort_values(["国GDP","国","人口","都市"],ascending=False)

となる。

つまり「数字→文字列」の順のセットを優先度の高い順に並べるイメージ
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away