Pythonでデータのカウント方法について
解決したいこと
PythonのCSVのセル指定の方法についてお伺いしたいです。
例えば、上記のようなCSVがあるときに気温差がマイナスであったとき次の年もマイナスである場合の数を数えたいのですがどのようなコードにすればよいのでしょうか?
自分の環境
pandasをインポートしています。
初めて質問するので何を書いておけばいいのかわかりません。。。
環境等で記入不足なものがあれば教えていただければ幸いです。
0
PythonのCSVのセル指定の方法についてお伺いしたいです。
例えば、上記のようなCSVがあるときに気温差がマイナスであったとき次の年もマイナスである場合の数を数えたいのですがどのようなコードにすればよいのでしょうか?
pandasをインポートしています。
初めて質問するので何を書いておけばいいのかわかりません。。。
環境等で記入不足なものがあれば教えていただければ幸いです。
こんにちは。
必要なもの…なんとなく標準ライブラリでなんとかなりそうですね。
csvを触るのであれば、「csv」の「reader」クラスとかでしょうか?
また、そのままcsvを読み込み操作をするとちょっと取り扱い辛いので、
最初に辞書を作ったうえでループを回し、
前年度を参照しながらカウントアップすると良いかもです。
カウント数える部分では、
もしかしたら同じく標準ライブラリcollectionsのCounterクラスが使えるかもですね。
@yuki_H_Web
Questioner
数千万行とかでなければパフォーマンス的にも特に問題にはならないと思いますので、一旦必要なデータフレームのカラムをリストにしてループを回してしまって、その後条件を満たす行のみ算出してカウントすればいける気がします!
例 :
import pandas as pd
# 仮データなので、実際はカラム名などが別になるのと、恐らく
# pd.read_csvなどを使われていると思います。
df = pd.DataFrame(
data=[{
'year': '2000',
'temperature_diff': -3.4,
}, {
'year': '2001',
'temperature_diff': 4.6,
}, {
'year': '2002',
'temperature_diff': -1.8,
}, {
'year': '2003',
'temperature_diff': -3.7,
}, {
'year': '2004',
'temperature_diff': -1.6,
}]
)
# tolistで一旦リストを作っています。
year_list = df['year'].tolist()
temperature_diff_list = df['temperature_diff'].tolist()
# 対象の年の気温がマイナス且つ翌年もマイナスであればTrue、それ以外
# (最後の行も含む)はFalseを格納するリスト。
next_year_is_also_minus_temps = []
data_len = len(year_list)
# zip使わない形で、indexの値で各リストの値を参照する形でも
# 問題ありません。
for index, (year, temperature_diff) in enumerate(zip(year_list, temperature_diff_list)):
# 対象の年の気温差が0以上であればFalseをリストへ追加。
if temperature_diff >= 0:
next_year_is_also_minus_temps.append(False)
continue
# 最終行の年の場合にはFalseをリストへ追加。
if index == data_len - 1:
next_year_is_also_minus_temps.append(False)
continue
# 翌年の気温がマイナスでは無い場合はFalseをリストへ追加。
next_year_temperature_diff = temperature_diff_list[index + 1]
if next_year_temperature_diff >= 0:
next_year_is_also_minus_temps.append(False)
continue
# 翌年もマイナスの場合はリストにTrueを追加。
next_year_is_also_minus_temps.append(True)
# 同一行数の真偽値のリストなどをデータフレームを指定することで、
# Trueの行のみ残したデータフレームを取得することができます。
# 参考 : http://hxn.blog.jp/archives/8906675.html
condition_satisfied_df = df[next_year_is_also_minus_temps]
print('-' * 20)
print('条件を満たす行にスライスされたデータフレーム :\n', condition_satisfied_df)
# 行数はlen関数で取れます。
print('-' * 20)
print('対象のデータ件数 :', len(condition_satisfied_df), '件')
出力結果 :
--------------------
条件を満たす行にスライスされたデータフレーム :
temperature_diff year
2 -1.8 2002
3 -3.7 2003
--------------------
対象のデータ件数 : 2 件
参考になりましたらLGTMぽちっと押していただけますと喜びます
@yuki_H_Web
Questioner