別のデータフレームの日付を比較してデータフレーム内の列の合計を見つける方法について質問をしました。しかし、私は今、同様のことをしたいが、別のIDと正確に一致する日付を持つIDを含める。パンダ:日付範囲とIDに基づいてデータフレームに金額を追加
df_a = pd.DataFrame({
'end':pd.to_datetime(['1/15/2016','1/15/2016','3/15/2016','5/15/2016','5/15/2016','7/15/2016']),
'ID':[1,2,1,2,1,1]
})
df_a['start'] = df_a.groupby('ID')['end'].shift().fillna(0)
df_a = df_a[['start','end','ID']]
df_b = pd.DataFrame({
'date':pd.to_datetime(['1/1/2016','1/1/2016','2/1/2016','2/1/2016','3/1/2016','3/1/2016','6/1/2016','6/1/2016','7/1/2016','7/1/2016','8/1/2016']),
'ID': [1, 2, 1, 2, 1, 2, 2, 1, 1, 2, 2],
'amount': [1, 2, 10, 20, 100, 200, 2000, 1000, 10000, 20000, 200000]
})
そして、私の所望の出力::私はmerge()
、merge_asof()
、combine_first()
、groupby()
を試してみましたが、近い得ている
start end ID amount
0 1970-01-01 2016-01-15 1 1
1 1970-01-01 2016-01-15 2 2
2 2016-01-15 2016-03-15 1 110
3 2016-01-15 2016-05-15 2 220
4 2016-03-15 2016-05-15 1 0
5 2016-05-15 2016-07-15 1 11000
、すべてではない方法
は、ここに私のコードです。ここで
は働く非パンダのバージョンですが、大規模なデータセットのために、私はこれが非常に遅くなることが想像:
amount = []
for s, e, i in zip(df_a['start'], df_a['end'], df_a['ID']):
amount.append(df_b['amount'][(s < df_b['date']) & (df_b['date'] <= e) & (df_b['ID'] == i)].sum())
df_a['amount'] = pd.Series(amount)
は、事前に感謝をいくつかの助けを大好きです。
これは正しい答えとしてマークするつもりですが、うまくいくからですが、*うわーです。それは私が消化するのに時間が必要ないくつかのより高いレベルのパンダです。素晴らしい学習体験、ありがとう! – pshep123