1. ホーム
  2. python

[解決済み] pandas DataFrameをGroupByして、最も一般的な値を選択する。

2022-05-05 20:45:39

質問

3つの文字列を持つデータフレームがあります。3番目の列の値は、最初の2つの組み合わせに対して1つだけ有効であることが分かっています。データをきれいにするために、最初の2列でデータフレームをグループ化し、各組み合わせについて3列目の最も一般的な値を選択する必要があります。

私のコード

import pandas as pd
from scipy import stats

source = pd.DataFrame({'Country' : ['USA', 'USA', 'Russia','USA'], 
                  'City' : ['New-York', 'New-York', 'Sankt-Petersburg', 'New-York'],
                  'Short name' : ['NY','New','Spb','NY']})

print source.groupby(['Country','City']).agg(lambda x: stats.mode(x['Short name'])[0])

最後の行がうまくいきません。quot;Key error 'Short name'"と表示され、Cityのみでグループ化しようとすると、AssertionErrorが発生しました。どうすれば直せますか?

解決方法は?

を使用することができます。 value_counts() でカウント系列を取得し、最初の行を取得します。

import pandas as pd

source = pd.DataFrame({'Country' : ['USA', 'USA', 'Russia','USA'], 
                  'City' : ['New-York', 'New-York', 'Sankt-Petersburg', 'New-York'],
                  'Short name' : ['NY','New','Spb','NY']})

source.groupby(['Country','City']).agg(lambda x:x.value_counts().index[0])

.agg()の中で他のagg関数を実行するのが気になる場合 を試してみてください。

# Let's add a new col,  account
source['account'] = [1,2,3,3]

source.groupby(['Country','City']).agg(mod  = ('Short name', \
                                        lambda x: x.value_counts().index[0]),
                                        avg = ('account', 'mean') \
                                      )