web-dev-qa-db-ja.com

パンダを使用して特定の条件に一致する列の値を合計するにはどうすればよいですか?

次のような列があるとします。

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

bの値を合計したいのですが、たとえばa = 1です。これにより、5 + 7 + 3 = 15が得られます。

パンダでこれを行うにはどうすればよいですか?

47
adijo

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

ブールインデックス

おそらく、値を選択する最も一般的な方法は、 ブールインデックス を使用することです。

この方法では、列 '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

別のアプローチは、 groupby を使用して、列 'a'の値に従ってDataFrameを部分に分割することです。次に、各部分を合計して、1が加算された値を引き出します。

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

この方法は、ブールインデックスを使用するよりも遅い可能性がありますが、列aの他の値の合計を確認する場合に役立ちます。

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

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())
1
Himanshu Poddar