python : csvファイル , 指定した値の取得及び合計(sumif) Pandas

pythoncsvファイルの使い方で、割とよく使うのが、

excelでいう、sumifの使い方です。

csvから読み込むときは、

① 指定した値を取得

② 指定した列の合計を取得

という形で組み合わせてやります。

 

プログラムpandasを使うので、まずはインポート

import pandas as pd

 

まずは、使うcsvファイルを作成します(前回と同じなので、説明は省略します。

#CSVファイルの作成
f_csv = open('csv_file.csv','w',encoding='utf-8')

#ファイルへの書き込み
f_csv.write('No'+',')
f_csv.write('Total'+'\n')

#書き込むための変数0(延べ数)
j = 0
i_0 = 0
#せっかくなので,for文で繰り返し書き込む
for i in range(1,21):
#延べの計算
j = j + i

if i > 10:
#i_0を足していく
i_0 = i_0 + 1
#回数i_0を書き込む
f_csv.write(str(i_0)+',')
#延べ数を書き込む
f_csv.write(str(j)+'\n')

else:
#回数iを書き込む
f_csv.write(str(i)+',')
#延べ数を書き込む
f_csv.write(str(j)+'\n')

#開いたcsvファイルを閉じる
f_csv.close()

 

ここからが本題です。

まず、csvファイルをpandasで読み取ります。

f_csv_pd = pd.read_csv('csv_file.csv')

指定した値の抽出の方法は、下記の記述します。

 

f_csv_pd[f_csv_pd.No == 1]

f_csv_pd[f_csv_pd['No'] == 1]

これを出力すると(print)このようになります。

f:id:Kangkang1981:20200316204624j:plain

 

後は、前に記事にした合計をの取得の方法は下記でしたが、

sum(f_csv_pd['Total'])

これのf_csv_pdの部分を上の

f_csv_pd[f_csv_pd['No'] == 1]か

f_csv_pd[f_csv_pd.No == 1]

に変更してこのように記述します。

sum(f_csv_pd[f_csv_pd.No == 1]['Total'])

分かりにくかったら

f_index_No = _csv_pd[f_csv_pd.No == 1]

とでもしておいて、

sum(f_index_No['Total'])

でもよいです。

 

実際に書いてみると下記のようになり、

 

print('len_sum1-0 : '+str(sum(f_csv_pd[f_csv_pd.No == 1]['Total'])))
print('len_sum1-1 : '+str(sum(f_csv_pd[f_csv_pd['No'] == 1]['Total'])))
print('len_sum2 : '+str(sum(f_csv_pd[f_csv_pd['No'] == 2]['Total'])))
print('len_sum3 : '+str(sum(f_csv_pd[f_csv_pd['No'] == 3]['Total'])))

結果は下記のようになります。

f:id:Kangkang1981:20200316205320j:plain

 

実はこれ、このデータがほしくて、何気に数日悩みました(苦笑)

しかも記事にしよう!と思い書こうとして、また忘れておりました。。。

ただ、おかげでまた思い出せたので、よかったです。

下記が全プログラムとなります。

 

import pandas as pd

#CSVファイルの作成
f_csv = open('csv_file.csv','w',encoding='utf-8')

#ファイルへの書き込み
f_csv.write('No'+',')
f_csv.write('Total'+'\n')

#書き込むための変数0(延べ数)
j = 0
i_0 = 0
#せっかくなので,for文で繰り返し書き込む
for i in range(1,21):
    #延べの計算
    j = j + i
        
    if i > 10:
        #i_0を足していく
        i_0 = i_0 + 1
        #回数i_0を書き込む
        f_csv.write(str(i_0)+',')
        #延べ数を書き込む
        f_csv.write(str(j)+'\n')

    else:
        #回数iを書き込む
        f_csv.write(str(i)+',')
        #延べ数を書き込む
        f_csv.write(str(j)+'\n')
    
#開いたcsvファイルを閉じる
f_csv.close()

f_csv_pd = pd.read_csv('csv_file.csv')

print('len : '+str(len(f_csv_pd)))
print('len_no : '+str(len(f_csv_pd['No'])))
print('len_total : '+str(len(f_csv_pd['Total'])))

print('sun_no : '+ str(sum(f_csv_pd['No'])))
print('sum_total : '+str(sum(f_csv_pd['Total'])))
print("")
print("")

#これで指定したNoを取得できます(下記の場合は1)
print(f_csv_pd[f_csv_pd.No == 1])
print(f_csv_pd[f_csv_pd['No'] == 1])


print('len_sum1-0 : '+str(sum(f_csv_pd[f_csv_pd.No == 1]['Total'])))
print('len_sum1-1 : '+str(sum(f_csv_pd[f_csv_pd['No'] == 1]['Total'])))


print('len_sum2 : '+str(sum(f_csv_pd[f_csv_pd['No'] == 2]['Total'])))
print('len_sum3 : '+str(sum(f_csv_pd[f_csv_pd['No'] == 3]['Total'])))

 

今までにpythonについて書いた記事はここにリンクを貼ってあります。

興味があればぜひご覧ください。