###前提
いつもお世話になっております。またまたデータフレームの操作方法について質問させていただきます。
下のようなデータフレームがあるとします。
humi temp year 0 98 23 2010 1 89 30 2011 2 85 22 2012 3 97 25 2013 4 84 24 2014 5 85 31 2015 6 88 22 2016
- humiはその年の湿度の代表値
- tempはその年の気温の代表値
- yearは年度
を表しているとします。
###実現したいこと
質問用に無理やり作ったので少し変な問題設定ですが、
0. humi(湿度)が90を超える年はhansode(半袖)が流行る
0. temp(気温)が25を超える年はTanktop(タンクトップ)が流行る
0. humi(湿度)が90以下、かつtemp(気温)が25以下の年は、前の年の流行が継続される(humi(湿度)が90を超える,かつtemp(気温)が25を超える年は無いものとする)
というルールに従い、データフレームに'clothes'の列を追加して、上記の結果を書き込みます。
出力結果としては次のようになるはずです。
humi temp year clothes 0 98 23 2010 hansode 1 89 30 2011 Tanktop 2 85 22 2012 Tanktop 3 97 25 2013 hansode 4 84 24 2014 hansode 5 85 31 2015 Tanktop 6 88 22 2016 Tanktop
###試したこと
applyとかmapなどを使ってなんとか出来ないものかと試みましたが、「前の年の流行が継続される」という部分が出来ませんでした。
Forループを使って無理やり書けばこんな感じです。
Python
1import pandas as pd 2 3# データフレームの定義 4df = pd.DataFrame( 5 {'year': [2010, 2011, 2012, 2013, 2014, 2015, 2016], 6 'humi': [98, 89, 85, 97, 84, 85, 88], 7 'temp': [23, 30, 22, 25, 24, 31, 22]}) 8 9# 空のデータフレームを作る 10df_e = pd.DataFrame(index=range(len(df)), columns=['clothes']) 11 12# Forループで判定 13for i in range(len(df)): 14 if df.ix[i,'humi'] > 90: 15 df_e.ix[i,'clothes'] = 'hansode' 16 elif i > 0 and df.ix[i,'temp'] > 25: 17 df_e.ix[i,'clothes'] = 'Tanktop' 18 else: 19 df_e.ix[i,'clothes'] = 1 20 21# 無理やりくっつける 22df = pd.concat([df,df_e],axis=1) 23 24 # 「1」を置き換える 25for i in range(len(df)): 26 if i > 0 and df.ix[i,'clothes'] == 1: 27 df.ix[i,'clothes'] = df.ix[i-1,'clothes'] 28 29print(df)
別に好んでForループを使っているわけではなく、なるべく短く簡潔に、かつ高速に動くものを作りたいと思っています。
うまい方法があれば教えていただければと思います。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。