私は単純なPandas
dataframe
です。ここで、各行は個人と日付範囲を表しています。それぞれの人のために、ハードコードされた範囲(変数period_start
とperiod_end
で定義される)の何パーセントの日数がdataframe
のさまざまなエントリに渡ってカバーされているか知りたいと思います。パンダのグループ機能で範囲をカバーする日の割合を計算する
私はPandas
でこれを行う簡単な方法があると思いますが、見つけられませんでした。私は複数のdataframes
といくつかのネストされたループを持つソリューションを持っていますが、これは規模が非効率です。 Pandas
を利用すると、これをより効果的に行うにはどうすればよいですか?私はgroupby
が理にかなっていますが、範囲が2つの列にまたがって重なり合っている場合には、その方法を理解していないと思います。
import pandas as pd
from datetime import datetime
df = pd.DataFrame(data=[['2016-01-01', '2016-01-31', 'A'],
['2016-02-02', '2016-02-10', 'A'],
['2016-03-01', '2016-04-01', 'A'],
['2016-01-01', '2016-03-01', 'B']],
columns=['startdate', 'enddate', 'person'])
# start and end date
period_start = datetime(year=2016, month=01, day=01)
period_end = datetime(year=2016, month=12, day=31)
# dates_dfculate totals days
total_days = (period_end-period_start).days + 1
# convert columns to dates
df['startdate']= pd.to_datetime(df['startdate'], format='%Y-%m-%d')
df['enddate']= pd.to_datetime(df['enddate'], format='%Y-%m-%d')
# create a TimeIndex dataframe with columns for each person
rng = pd.date_range(period_start, periods=total_days, freq='D')
people = list(set(df['person'].tolist()))
dates_df = pd.DataFrame(columns=[people], index=rng).fillna(False)
# loop over each date (index)
for index, row in dates_df.iterrows():
# loop over each column (person)
for person in people:
tmp = df[df['person'] == person]
# loop over each each entry for the person
for index1, row1 in tmp.iterrows():
# check if the date is date index in dates_df is within range
value = row1['startdate'] <= index <= row1['enddate']
# if it's not already set to true, set it to true
if dates_df.ix[index, person] == False and value == True:
dates_df.ix[index, person] = True
# for each person, show the percentage of days in range that are covered
for person in people:
print person, sum(dates_df[person].tolist())/float(total_days)
所望の出力:
A 0.196721311475
B 0.166666666667
あなたの望む出力は***に似ていますか? – Abdou
これは単なる一人の人のループであり、その割合を印刷します。質問に出力を追加しました。 – user2242044