增量添加 pandas 列值
Incrementally add pandas column value
我有这样一个数据框:
id trade_id tradedate settledate amt
3136 6828 20200616 20200630 15000000.0
3136 6934 20200616 20200630 15000000.0
3136 7007 20200618 20200630 30000000.0
3136 7050 20200620 20200630 25000000.0
3137 7091 20200612 20200630 25000000.0
3137 7092 20200615 20200630 25000000.0
我想做两件事。
当交易发生在特定的 date.Ex:for id 3136 时添加之前的金额
2笔交易发生在6月16日,下一个18日和下一个20日。
所以输出将是:
id tradedate amt
3136 20200616 30000000
3136 20200618 60000000
3136 20200620 85000000
3137 20200612 25000000
3137 20200615 50000000
下一个任务是找出缺失的日期并填充上次计算的 amt.So 最终输出将如下所示:
id tradedate amt
3136 20200616 30000000
3136 20200617 30000000
3136 20200618 60000000
3136 20200619 60000000
3136 20200620 85000000
3137 20200612 25000000
3137 20200613 25000000
3137 20200614 25000000
3137 20200615 50000000
我怎样才能有效地实现这一点?
试过这个:
df_agg = df_joined.groupby(['id', 'tradedate'])[
'amt'].agg('sum').reset_index()
df_agg['cumsum'] = df_agg.groupby('id').amt.cumsum()
但无法获取缺失的日期部分 here.Any 将不胜感激。
使用 groupby
得到 id
和 tradedate
的总和,但首先将 tradedate
转换为实际日期以进行上采样:
df['tradedate'] = pd.to_datetime(df['tradedate'], format='%Y%m%d')
>>> df.groupby(['id', 'tradedate'])['amt'].sum() \
.groupby('id').cumsum().reset_index(level=0) \
.resample('D').pad().reset_index()
tradedate id amt
0 2020-06-12 3137 25000000.0
1 2020-06-13 3137 25000000.0
2 2020-06-14 3137 25000000.0
3 2020-06-15 3137 50000000.0
4 2020-06-16 3136 30000000.0
5 2020-06-17 3136 30000000.0
6 2020-06-18 3136 60000000.0
7 2020-06-19 3136 60000000.0
8 2020-06-20 3136 85000000.0
尝试:
df_out = df.groupby(['id','tradedate'])['amt'].sum().groupby('id').cumsum().reset_index()
输出:
id tradedate amt
0 3136 20200616 30000000.0
1 3136 20200618 60000000.0
2 3136 20200620 85000000.0
3 3137 20200612 25000000.0
4 3137 20200615 50000000.0
然后,
df_out['tradedate'] = pd.to_datetime(df_out['tradedate'], format='%Y%m%d')
df_out.groupby("id").apply(
lambda x: x.set_index("tradedate")
.reindex(pd.date_range(x["tradedate"].min(), x["tradedate"].max(), freq="D"))
.reset_index()
.ffill()
).reset_index(drop=True)
输出:
index id amt
0 2020-06-16 3136.0 30000000.0
1 2020-06-17 3136.0 30000000.0
2 2020-06-18 3136.0 60000000.0
3 2020-06-19 3136.0 60000000.0
4 2020-06-20 3136.0 85000000.0
5 2020-06-12 3137.0 25000000.0
6 2020-06-13 3137.0 25000000.0
7 2020-06-14 3137.0 25000000.0
8 2020-06-15 3137.0 50000000.0
给这只猫剥皮的方法有很多,但这是我的解决方案>
df.tradedate = pd.to_datetime(df.tradedate, format='%Y%m%d')
(df.
groupby(['id', 'tradedate'])['amt'].
sum().
groupby('id').
cumsum().
reset_index().
set_index('tradedate').
groupby('id').
apply(lambda x: x.drop('id',axis=1).asfreq('D', method= 'ffill')).
reset_index()
)
我有这样一个数据框:
id trade_id tradedate settledate amt
3136 6828 20200616 20200630 15000000.0
3136 6934 20200616 20200630 15000000.0
3136 7007 20200618 20200630 30000000.0
3136 7050 20200620 20200630 25000000.0
3137 7091 20200612 20200630 25000000.0
3137 7092 20200615 20200630 25000000.0
我想做两件事。
当交易发生在特定的 date.Ex:for id 3136 时添加之前的金额 2笔交易发生在6月16日,下一个18日和下一个20日。 所以输出将是:
id tradedate amt
3136 20200616 30000000
3136 20200618 60000000
3136 20200620 85000000
3137 20200612 25000000
3137 20200615 50000000
下一个任务是找出缺失的日期并填充上次计算的 amt.So 最终输出将如下所示:
id tradedate amt
3136 20200616 30000000
3136 20200617 30000000
3136 20200618 60000000
3136 20200619 60000000
3136 20200620 85000000
3137 20200612 25000000
3137 20200613 25000000
3137 20200614 25000000
3137 20200615 50000000
我怎样才能有效地实现这一点? 试过这个:
df_agg = df_joined.groupby(['id', 'tradedate'])[
'amt'].agg('sum').reset_index()
df_agg['cumsum'] = df_agg.groupby('id').amt.cumsum()
但无法获取缺失的日期部分 here.Any 将不胜感激。
使用 groupby
得到 id
和 tradedate
的总和,但首先将 tradedate
转换为实际日期以进行上采样:
df['tradedate'] = pd.to_datetime(df['tradedate'], format='%Y%m%d')
>>> df.groupby(['id', 'tradedate'])['amt'].sum() \
.groupby('id').cumsum().reset_index(level=0) \
.resample('D').pad().reset_index()
tradedate id amt
0 2020-06-12 3137 25000000.0
1 2020-06-13 3137 25000000.0
2 2020-06-14 3137 25000000.0
3 2020-06-15 3137 50000000.0
4 2020-06-16 3136 30000000.0
5 2020-06-17 3136 30000000.0
6 2020-06-18 3136 60000000.0
7 2020-06-19 3136 60000000.0
8 2020-06-20 3136 85000000.0
尝试:
df_out = df.groupby(['id','tradedate'])['amt'].sum().groupby('id').cumsum().reset_index()
输出:
id tradedate amt
0 3136 20200616 30000000.0
1 3136 20200618 60000000.0
2 3136 20200620 85000000.0
3 3137 20200612 25000000.0
4 3137 20200615 50000000.0
然后,
df_out['tradedate'] = pd.to_datetime(df_out['tradedate'], format='%Y%m%d')
df_out.groupby("id").apply(
lambda x: x.set_index("tradedate")
.reindex(pd.date_range(x["tradedate"].min(), x["tradedate"].max(), freq="D"))
.reset_index()
.ffill()
).reset_index(drop=True)
输出:
index id amt
0 2020-06-16 3136.0 30000000.0
1 2020-06-17 3136.0 30000000.0
2 2020-06-18 3136.0 60000000.0
3 2020-06-19 3136.0 60000000.0
4 2020-06-20 3136.0 85000000.0
5 2020-06-12 3137.0 25000000.0
6 2020-06-13 3137.0 25000000.0
7 2020-06-14 3137.0 25000000.0
8 2020-06-15 3137.0 50000000.0
给这只猫剥皮的方法有很多,但这是我的解决方案>
df.tradedate = pd.to_datetime(df.tradedate, format='%Y%m%d')
(df.
groupby(['id', 'tradedate'])['amt'].
sum().
groupby('id').
cumsum().
reset_index().
set_index('tradedate').
groupby('id').
apply(lambda x: x.drop('id',axis=1).asfreq('D', method= 'ffill')).
reset_index()
)