🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
GROUP BY

GROUP BYとはSQL文のひとつで、SELECT文において特定の列の値が等しい行ごとに表をグループ化します。

Python

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

Q&A

解決済

2回答

3052閲覧

グループ別に欠損値の数をカウントしたい。

Dantesu

総合スコア8

GROUP BY

GROUP BYとはSQL文のひとつで、SELECT文において特定の列の値が等しい行ごとに表をグループ化します。

Python

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

0グッド

0クリップ

投稿2021/01/30 13:36

編集2021/01/30 16:23

以下の列で構成されるデータフレーム"df"(一部の列省略)があり、Group別にBirtdayの欠損値の数をカウントしたいです。お手数をおかけして恐れ入りますが、ご教示お願いします。
「dfの列」
GroupID,GroupName,personalID,Sex,Birthday,値(省略)

「これまでやったこと」
(1)df.isnull().sum()で欠損値の数が分かり、
(2)df.isnull().apply(lambda col: col.value_counts(), axis=0).fillna(0).astype(np.float).apply(lambda col: col/col.sum(), axis=0) で
列別の欠損値の割合が分かりました。特にbirthdayに欠損値の割合が高いです。

「今やりたいこと」
特定のGroupの場合に欠損値が集中している事を示したいです。
⇒実際には元ファイルを目視して分かりましたが、(特に今後件数が増えた場合に備えて)プログラミングの勉強として知りたいです。

「追記:対処したこと」
df2=df.groupby('GroupName').count()[['GroupID','Birthday']] で出し、
df2['GAP']=df2['GroupID']-df2['Birthday']
df2.sort_values('GAP',ascending=False)
で欠損値の数を比較しました。

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

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

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

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

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

guest

回答2

0

自己解決

df2=df.groupby('GroupName').count()[['GroupID','Birthday']] で出し、(GroupIDは全部あるので)割り算しました。
もっとスマートな方法がもしあればと思い、公開を継続しましたが、そろそろここでクローズさせて頂きます。
コメント頂いたppaul様、ありがとうございました。

投稿2021/02/06 07:13

Dantesu

総合スコア8

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

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

0

こんな感じです。

python

1>>> import pandas as pd 2>>> df=pd.DataFrame( 3... {'GroupID':[1,1,1,1,1,1,2,2,2,2,2,3,3,3,3], 4... 'GroupName':['a', 'a', 'a', 'a', 'a', 'a', 'b', 'b', 'b', 'b', 'b', 'c', 'c', 'c', 'c'], 5... 'personalID':[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], 6... 'Sex':['M', 'F', 'F', 'F', 'M', 'M', 'M', 'F', 'M', 'F', 'M', 'F', 'F', 'F', 'M'], 7... 'Birthday':[np.NaN,np.NaN,np.NaN,np.NaN,1,2,3,np.NaN,np.NaN,1,5,6,4,8,9], 8... '値':[41, 53, 38, 58, 58, 38, 54, 57, 49, 50, 52, 59, 33, 34, 54]}) 9>>> 10>>> 11>>> df2 = pd.concat([df['GroupName'],df['Birthday'].isnull()], axis=1).groupby('GroupName').mean() 12>>> print(df2) 13 Birthday 14GroupName 15a 0.666667 16b 0.400000 17c 0.000000

投稿2021/01/30 14:58

ppaul

総合スコア24670

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

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

Dantesu

2021/01/30 16:04 編集

私の場合、meanではなく.count()として活用させて頂きました。
Dantesu

2021/01/30 16:03

すみません。こちらでやると、欠損値の数ではなく、グループ別の行の数になるようです。
Dantesu

2021/01/30 16:16

df2=df.groupby('GroupName').count()[['GroupID','Birthday']] で出し、(GroupIDは全部あるので)割り算しました。もっとスマートな方法があればお願いします。
ppaul

2021/01/30 22:39

昨日の回答で、グループ別の欠損値の割合を出したのですが、それとは違うものを出したいのでしょうか。 何を出したいのかを書いてもらえませんか。
Dantesu

2021/01/31 07:12 編集

[Group別にBirtdayの欠損値の数をカウントしたい(=あるグループの欠損値が全体に占める割合を知る事で前処理の仕方の参考にしたい)]です。ppaul様の回答してくださったコードをはじめ私が正しく理解できておらず、meanをcountに変えておかしくなってしまったようです。失礼しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問