質問のコード、色々と嘘がありませんか?
・df.groupby(["国名"], as_index=False)["名前", "flag"]
とカラムを["名前"と"flag"]
の2つにフィルタリングしているが、 .agg()
では "id" と "flag" になっている
・更に結果の表のカラム名は '人口'と'flag' になっている
・ "flag" : "count"
の結果はデータ数が得られるので "flag"の数にはならないはずだが、結果は "flag"の数になっている
・結果は MultuIndexになるはずだがなっていない、
何を行いたいのかは分かるのですが、できましたら正確な情報を記述していただきますようお願いします。
で、flag
がbool
であるという前提で記述すると、今回の件は
・人口はわざわざ '名前': 'count'
または 'id': 'count'
でなくとも、 'flag': 'count'
でも求まる
・flagの数は 'flag': 'count'
ではなく 'flag': 'sum'
となる
・flagの割合は 'flag': 'mean'
で求まる
ので DataFrame.agg()
ではなく Series.agg()
を使って MultiIndexを回避しつつ dictデータでカラム名を設定すると
Python
1df.groupby(["国名"], as_index=False)['flag'].agg({'人口':'count', 'flag':'sum', '天才の割合':'mean'})
とシンプルに記述できるかと思います。
動作サンプル
Python
1import pandas as pd
2import numpy as np
3N = 10000
4df = pd.DataFrame({
5 '国名': np.random.choice(['hoge', 'foo'], N),
6 'id': np.arange(N),
7 '名前': np.arange(N).astype('str'),
8 'flag': np.random.choice([True, False], N, p=[0.3, 0.7])
9})
10ret = df.groupby(["国名"], as_index=False)['flag'].agg({'人口':'count', 'flag':'sum', '天才の割合':'mean'})
11print(ret)
12# 国名 人口 flag 天才の割合
13#0 foo 4947 1459.0 0.294926
14#1 hoge 5053 1479.0 0.292697
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/23 22:22