1. ホーム
  2. python

[解決済み] pandasを使用して、与えられた条件に一致するカラムの値を合計するにはどうすればよいですか?

2023-06-29 12:17:17

質問

このようなカラムがあるとします。

a   b  
1   5   
1   7
2   3
1   3
2   5

の値を合計したい。 b ここで a = 1 などとなります。この場合、次のようになります。 5 + 7 + 3 = 15 .

pandasでこれを行うにはどうしたらよいでしょうか?

どのように解決するのですか?

ここでの本質的な考え方は、合計したいデータを選択し、それらを合計することです。このデータの選択は、いくつかの異なる方法で行うことができ、そのうちのいくつかを以下に示します。

ブール式のインデックス作成

値を選択する最も一般的な方法は、間違いなく ブール式のインデックス付け .

この方法では、列 'a' がどこに等しいかを調べます。 1 を見つけ、列 'b' の対応する行を合計します。このとき loc を使って、行と列のインデックスを処理することができます。

>>> df.loc[df['a'] == 1, 'b'].sum()
15

ブールインデックスは他のカラムにも拡張することができます。例えば df にも列 'c' があり、'a' が 1 で 'c' が 2 である 'b' の行を合計したいとしたら、こう書くでしょう。

df.loc[(df['a'] == 1) & (df['c'] == 2), 'b'].sum()

クエリ

データを選択する別の方法として query で興味のある行をフィルタリングし、列 'b' を選択し、そして合計することです。

>>> df.query("a == 1")['b'].sum()
15

ここでも、この方法を拡張することで、より複雑なデータの選択を行うことができる。

df.query("a == 1 and c == 2")['b'].sum()

これはブール式インデックスのアプローチよりも少し簡潔であることに注意してください。

グループ化

別のアプローチとして groupby を使って、列 'a' の値に応じて DataFrame を分割することです。その後、各部分を合計して、1が加算された値を取り出すことができます。

>>> df.groupby('a')['b'].sum()[1]
15

この方法は,ブールインデックスを使うよりも遅くなる可能性が高いですが,カラム a :

>>> df.groupby('a')['b'].sum()
a
1    15
2     8