81113
Python3で `sum` を使ってExcelの行をフィルターして合計を求めたいです。  
実現したい内容が上手くいかないので質問させて頂きます。  
ご指導をお願いできますでしょうか。

**Excel Data**

No | 国 | 都市 | 地域数  
---|---|---|---  
1 | アメリカ | カリフォルニア | 22  
1 | アメリカ | フロリダ | 22  
2 | フランス | パリ | 13  
3 | 日本 | 東京 | 26  
3 | 日本 | 沖縄 | 14  
3 | 日本 | 京都 | 11  
  
実現したい内容の結果になります。  
例：アメリカをフィルターしてsumで地域数の合計数を求めたいです。

**Excel Data Result**

No | 国 | 地域数  
---|---|---  
1 | アメリカ | 44  
  
下記のコードでも試してみましたが、上手く希望通りの結果にならないです。  
` ＆` 複数条件で行う必要ありますか。

```

    import pandas as pd
    
    #エクセルを読込み
    filter= pd.read_excel('C:test.xlsx',sheet_name ='new_sheet_name')
    
    #アメリカが含んでいデータをカウント
    America=(filter == 'アメリカ').sum()
    t=America.loc["アメリカ"]
    print(t)
    
    #地域数かつアメリカが含んでいデータをカウント
    #America=(filter == 'アメリカ').sum()
    regions=America.loc["地域数"]
    print(regions)
    
```
CC BY-SA 4.0
2021-08-30T04:49:55.940
81110
2021-09-01T10:02:56.140
2021-09-01T10:02:56.140
3060
18859
question
python python3
Python SUMを使ってフィルターを行う方法について
[groupby](https://pandas.pydata.org/pandas-
docs/stable/reference/api/pandas.DataFrame.groupby.html)で`No`と`国`ごとにグループ化します。  
グループ化した後に`sum`関数を呼び出すことでグループごとすなわち国ごとの地域数を合計します。  
[query](https://pandas.pydata.org/pandas-
docs/stable/reference/api/pandas.DataFrame.query.html?highlight=query#pandas.DataFrame.query)で`国`が`アメリカ`の行を抽出します。

```

    import pandas as pd
    
    df = pd.DataFrame(data = [[1,"アメリカ","カリフォルニア",22],
                                 [1,"アメリカ","フロリダ",22],
                                 [2,"フランス","パリ",13],
                                 [3,"日本","東京",26],
                                 [3,"日本","沖縄",14],
                                 [3,"日本","京都",11],
                                ],
                          columns = ["No", "国", "都市", "地域数"])
    
    america = df.groupby(["No", "国"], as_index=False).sum().query("国 == 'アメリカ'")
    print(america)
    """ 
       No     国  地域数
    0   1  アメリカ   44
    """ 
    
```

参考資料：

  * [pandas.DataFrameの行を条件で抽出するquery](https://note.nkmk.me/python-pandas-query/)
  * [Pandas の groupby の使い方](https://qiita.com/propella/items/a9a32b878c77222630ae)
CC BY-SA 4.0
2021-08-30T05:21:42.957
81111
2021-08-30T05:21:42.957
9820
81110
answer
以下は
[pandas.DataFrame.agg](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.agg.html#pandas-
dataframe-agg) を使う方法です。なお、Python3 には `filter`
というクラスがデフォルトで存在するので、データフレーム名(`filter`)を別の名前(`df`)に置き換えています。

※ 動作確認のためデータフレームにデータを追加しています(`No` が 4 の行)。

No | 国 | 都市 | 地域数  
---|---|---|---  
1 | アメリカ | カリフォルニア | 22  
1 | アメリカ | フロリダ | 22  
4 | アメリカ | ニューヨーク | 42  
4 | アメリカ | ロサンゼルス | 58  
2 | フランス | パリ | 13  
3 | 日本 | 東京 | 26  
3 | 日本 | 沖縄 | 14  
3 | 日本 | 京都 | 11

```

    dfx = (
      df[df['国']=='アメリカ']
        .groupby('No', as_index=False)
        .agg({'No':'first', '国':'first', '地域数':'sum'}))
    
    print(dfx.to_markdown(index=False))
    
```  
  
**出力結果**

No | 国 | 地域数  
---|---|---  
1 | アメリカ | 44  
4 | アメリカ | 100  
  
**追記**

> No、国、首都、地域数
>
> 1 アメリカ ニューヨーク カリフォルニア 地域数  
>  2 アメリカ 空白 カリフォルニア 地域数
>
> のように首都に空白が入ると合計が上手く出力されないです。

> 上記のコードは同じ「国」であれば No は同じ、という前提で書きました。そうではないのですね？

> そうですね。

以下の様に書き直してみました。`No` についは最小値が表示されます。

```

    import pandas as pd
    
    df = pd.read_excel('test.xlsx')
    dfx = (
      df[df['国']=='アメリカ']
        .agg({'No':'min', '国':'min', '地域数':'sum'})
        .to_frame().T)
    
```

**Excel Data**

No | 国 | 首都 | 都市 | 地域数  
---|---|---|---|---  
1 | アメリカ | ワシントン | ニューヨーク | 22  
2 | アメリカ |  | カリフォルニア | 22  
3 | フランス | パリ | パリ | 13  
4 | 日本 | 東京 | 東京 | 26  
4 | 日本 | 東京 | 沖縄 | 14  
4 | 日本 | 東京 | 京都 | 11  
  
**実行結果**

No | 国 | 地域数  
---|---|---  
1 | アメリカ | 44
CC BY-SA 4.0
2021-08-30T05:52:34.817
81113
2021-08-31T04:37:13.570
2021-08-31T04:37:13.570
47127
47127
81110
answer