次のような列があるとします。
a b
1 5
1 7
2 3
1 3
2 5
b
の値を合計したいのですが、たとえばa = 1
です。これにより、5 + 7 + 3 = 15
が得られます。
パンダでこれを行うにはどうすればよいですか?
ここでの基本的な考え方は、合計するデータを選択してから合計することです。このデータの選択は、いくつかの異なる方法で実行できます。そのいくつかを以下に示します。
おそらく、値を選択する最も一般的な方法は、 ブールインデックス を使用することです。
この方法では、列 '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()
データを選択するもう1つの方法は、 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
Groupbyまたはlocを使用せずにこれを行うこともできます。コードに条件を含めるだけです。データフレームの名前をdfにします。次に試すことができます:
df[df['a']==1]['b'].sum()
またはあなたも試すことができます:
sum(df[df['a']==1]['b'])
別の方法は、pythonのnumpyライブラリを使用することです。
import numpy as np
print(np.where(df['a']==1, df['b'],0).sum())