[解決済み] Pandasの集約関数で返されたカラムに名前を付ける?[重複)。
質問
Pandasのgroupby機能で困っています。私は ドキュメント しかし、複数のカラムに集約関数を適用する方法がわかりません。 と は、それらの列にカスタム名を付けています。
これは非常に近いですが、返されるデータ構造にはネストされた列見出しがあります。
data.groupby("Country").agg(
{"column1": {"foo": sum()}, "column2": {"mean": np.mean, "std": np.std}})
(つまり、column2 の平均と標準を取りたいが、それらの列を "mean" と "std" として返したい)
何が足りないのでしょうか?
解決方法は?
パンダの場合 >= 0.25
返された集約カラムに名前を付ける機能が
masterブランチに再導入されました。
で、pandas 0.25をターゲットにしています。新しい構文は
.agg(new_col_name=('col_name', 'agg_func')
. 詳細な例は、上記のリンク先のPRにあります。
In [2]: df = pd.DataFrame({'kind': ['cat', 'dog', 'cat', 'dog'],
...: 'height': [9.1, 6.0, 9.5, 34.0],
...: 'weight': [7.9, 7.5, 9.9, 198.0]})
...:
In [3]: df
Out[3]:
kind height weight
0 cat 9.1 7.9
1 dog 6.0 7.5
2 cat 9.5 9.9
3 dog 34.0 198.0
In [4]: df.groupby('kind').agg(min_height=('height', 'min'),
max_weight=('weight', 'max'))
Out[4]:
min_height max_weight
kind
cat 9.1 9.9
dog 6.0 198.0
また、この構文と私が以前提案した2段階のリネーム構文で、以下のように複数のラムダ式を使用することが可能になります。 このPR . ここでもPRにある例からコピーしています。
In [2]: df = pd.DataFrame({"A": ['a', 'a'], 'B': [1, 2], 'C': [3, 4]})
In [3]: df.groupby("A").agg({'B': [lambda x: 0, lambda x: 1]})
Out[3]:
B
<lambda> <lambda 1>
A
a 0 1
で、次に
.rename()
, または一回で。
In [4]: df.groupby("A").agg(b=('B', lambda x: 0), c=('B', lambda x: 1))
Out[4]:
b c
A
a 0 0
パンダの場合 < 0.25
現在受け入れられているunutbuによる回答は、pandasのバージョン <= 0.20でこれを行う素晴らしい方法を記述しています。しかし、pandas 0.20の時点で、この方法を使用すると、pandasの将来のバージョンでこの構文が使用できないことを示す警告が表示されます。
シリーズです。
<ブロッククオート将来の警告: 集約のために Series で dict を使用することは非推奨であり、将来のバージョンで削除される予定です。
データフレーム
FutureWarning: リネームを伴うdictの使用は非推奨であり、将来のバージョンで削除される予定です。
によると pandas 0.20 changelog で、集計時に列の名前を変更する推奨方法は以下の通りです。
# Create a sample data frame
df = pd.DataFrame({'A': [1, 1, 1, 2, 2],
'B': range(5),
'C': range(5)})
# ==== SINGLE COLUMN (SERIES) ====
# Syntax soon to be deprecated
df.groupby('A').B.agg({'foo': 'count'})
# Recommended replacement syntax
df.groupby('A').B.agg(['count']).rename(columns={'count': 'foo'})
# ==== MULTI COLUMN ====
# Syntax soon to be deprecated
df.groupby('A').agg({'B': {'foo': 'sum'}, 'C': {'bar': 'min'}})
# Recommended replacement syntax
df.groupby('A').agg({'B': 'sum', 'C': 'min'}).rename(columns={'B': 'foo', 'C': 'bar'})
# As the recommended syntax is more verbose, parentheses can
# be used to introduce line breaks and increase readability
(df.groupby('A')
.agg({'B': 'sum', 'C': 'min'})
.rename(columns={'B': 'foo', 'C': 'bar'})
)
をご覧ください。 0.20 チェンジログ をご覧ください。
2017-01-03更新 @JunkMechanicさんのコメントに対応しました。
旧スタイルの辞書構文では、複数の
lambda
関数に
.agg
というのは、渡された辞書のキーを使って名前が変更されるからです。
>>> df.groupby('A').agg({'B': {'min': lambda x: x.min(), 'max': lambda x: x.max()}})
B
max min
A
1 2 0
2 4 3
複数の関数をリストとして1つのカラムに渡すことも可能です。
>>> df.groupby('A').agg({'B': [np.min, np.max]})
B
amin amax
A
1 0 2
2 3 4
しかし、ラムダ関数は匿名であり、すべて
<lambda>
となり、名前の衝突が発生します。
>>> df.groupby('A').agg({'B': [lambda x: x.min(), lambda x: x.max]})
SpecificationError: Function names must be unique, found multiple named <lambda>
を回避するために
SpecificationError
を使用する代わりに、名前付き関数を事前に定義することができます。
lambda
. また、適切な関数名により
.rename
を後からデータフレームに追加することができます。これらの関数は、上記と同じリスト構文で渡すことができます。
>>> def my_min(x):
>>> return x.min()
>>> def my_max(x):
>>> return x.max()
>>> df.groupby('A').agg({'B': [my_min, my_max]})
B
my_min my_max
A
1 0 2
2 3 4
関連
-
[解決済み] 関数デコレータを作成し、それらを連鎖させるには?
-
[解決済み] 関数内でグローバル変数を使用する
-
[解決済み] PandasでDataFrameの行を反復処理する方法
-
[解決済み] Pandasのカラム名のリネーム
-
[解決済み] Pandas DataFrameからカラムを削除する
-
[解決済み] Pandasのデータフレームで複数の列を選択する
-
[解決済み] Pandas DataFrameの行数を取得する方法は?
-
[解決済み] 複数の列でgroup byを使用する
-
[解決済み】Pandas DataFrameのカラムヘッダからリストを取得する。
-
[解決済み】複数のgroupbyカラムに複数の関数を適用する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Pythonの非常に便利な2つのデコレーターを解説
-
ピロウズ画像色処理の具体的な活用方法
-
Pythonによるjieba分割ライブラリ
-
[解決済み】pygame.error: ビデオシステムが初期化されていない
-
[解決済み】終了コード -1073741515 (0xC0000135)でプロセス終了)
-
[解決済み】TypeError: 系列を <class 'float'> に変換することができません。
-
[解決済み】「SyntaxError.Syntax」は何ですか?Missing parentheses in call to 'print'」はPythonでどういう意味ですか?
-
[解決済み】Python elifの構文が無効です【終了しました
-
[解決済み】「OverflowError: Python int too large to convert to C long" on windows but not mac
-
[解決済み】pandas GroupBy.agg()を使って同じ列を複数回集約する。)