Python 数据帧与指示符数据帧的累计和
我有一个pandas数据框(Python 数据帧与指示符数据帧的累计和,python,python-3.x,pandas,Python,Python 3.x,Pandas,我有一个pandas数据框(df),其中包含我想根据另一个pandas数据框(dfIdx)中的信息求和的信息,该数据框具有相同的列和索引。特别是,如果df采用以下形式: df = pd.DataFrame([[172770, 1442, 114581],[35464, 67062, 175285],[124399, 14294, 44104],[50608, 58802, 189253],[1000, 10000, 100000]],columns=['A','B','C']) dfIdx =
df
),其中包含我想根据另一个pandas数据框(dfIdx
)中的信息求和的信息,该数据框具有相同的列和索引。特别是,如果df
采用以下形式:
df = pd.DataFrame([[172770, 1442, 114581],[35464, 67062, 175285],[124399, 14294, 44104],[50608, 58802, 189253],[1000, 10000, 100000]],columns=['A','B','C'])
dfIdx = pd.DataFrame([[0, 0, 1], [0, 0, 0], [0, 1, 0], [1, 1, 0],[0,0,1]],columns=['A','B','C'])
以及以下形式的dfIdx:
df = pd.DataFrame([[172770, 1442, 114581],[35464, 67062, 175285],[124399, 14294, 44104],[50608, 58802, 189253],[1000, 10000, 100000]],columns=['A','B','C'])
dfIdx = pd.DataFrame([[0, 0, 1], [0, 0, 0], [0, 1, 0], [1, 1, 0],[0,0,1]],columns=['A','B','C'])
我希望结果是前面df
中的行的累积和,包括dfIdx
中的行,其值为1
。因此,结果应该如下所示:
A B C
0 0 0 114581
1 0 0 0
2 0 82798 0
3 383241 58802 0
4 0 0 508642
对于额外的积分,我想在累计金额包括供款的时间上灵活一些。例如,如果累积和的窗口是1
,那么我最多只想包括前一行,给出结果:
A B C
0 0 0 114581
1 0 0 0
2 0 81356 0
3 175007 58802 0
4 0 0 289253
我意识到我给出的原始示例没有提供我想要的所有行为示例,因此,建议的解决方案是不完整的。我用另一行增加了数据,以提供更多样化的行为。编辑以满足新的要求并扩展数据集
输出:
A B C
0 0 0 114581
1 0 0 0
2 0 82798 0
3 383241 58802 0
4 0 0 508642
A B C
0 0.0 0.0 114581.0
1 0.0 0.0 0.0
2 0.0 81356.0 0.0
3 175007.0 58802.0 0.0
4 0.0 0.0 289253.0
A B C
0 0 0 114581
1 0 0 0
2 0 82798 0
3 383241 58802 0
A B C
0 0.0 0.0 114581.0
1 0.0 0.0 0.0
2 0.0 81356.0 0.0
3 175007.0 58802.0 0.0
额外学分的更新:
n=1 #for summing 1 pervious value
df_out = (df.apply(lambda x: x.groupby(dfIdx.loc[::-1,x.name].cumsum().replace(0,pd.np.nan).bfill())
.rolling(n+1,min_periods=1).sum().reset_index(level=0,drop=True)
.mul(dfIdx[x.name])))
输出:
A B C
0 0 0 114581
1 0 0 0
2 0 82798 0
3 383241 58802 0
4 0 0 508642
A B C
0 0.0 0.0 114581.0
1 0.0 0.0 0.0
2 0.0 81356.0 0.0
3 175007.0 58802.0 0.0
4 0.0 0.0 289253.0
A B C
0 0 0 114581
1 0 0 0
2 0 82798 0
3 383241 58802 0
A B C
0 0.0 0.0 114581.0
1 0.0 0.0 0.0
2 0.0 81356.0 0.0
3 175007.0 58802.0 0.0
注意:您使用反向
进行的观察非常接近。我也在做同样的事情。这完全是关于如何对dfIdx进行分组的问题
让我们试试:
df_out = (df.apply(lambda x: x.groupby(dfIdx[x.name].cumsum().replace(0,pd.np.nan).bfill())
.transform('cumsum')
.mul(dfIdx[x.name])))
输出:
A B C
0 0 0 114581
1 0 0 0
2 0 82798 0
3 383241 58802 0
4 0 0 508642
A B C
0 0.0 0.0 114581.0
1 0.0 0.0 0.0
2 0.0 81356.0 0.0
3 175007.0 58802.0 0.0
4 0.0 0.0 289253.0
A B C
0 0 0 114581
1 0 0 0
2 0 82798 0
3 383241 58802 0
A B C
0 0.0 0.0 114581.0
1 0.0 0.0 0.0
2 0.0 81356.0 0.0
3 175007.0 58802.0 0.0
对于“额外学分”,其中n=1,我们使用2的滚动期:
n=1 #for summing 1 pervious value
df_out = (df.apply(lambda x: x.groupby(dfIdx[x.name].cumsum().replace(0,pd.np.nan).bfill())
.rolling(n+1,min_periods=1).sum().reset_index(level=0,drop=True)
.mul(dfIdx[x.name])))
输出:
A B C
0 0 0 114581
1 0 0 0
2 0 82798 0
3 383241 58802 0
4 0 0 508642
A B C
0 0.0 0.0 114581.0
1 0.0 0.0 0.0
2 0.0 81356.0 0.0
3 175007.0 58802.0 0.0
4 0.0 0.0 289253.0
A B C
0 0 0 114581
1 0 0 0
2 0 82798 0
3 383241 58802 0
A B C
0 0.0 0.0 114581.0
1 0.0 0.0 0.0
2 0.0 81356.0 0.0
3 175007.0 58802.0 0.0
怎么用?
步骤1:在dfIdx中获取分组:
步骤2:使用该分组对df进行“变换”或“滚动”
df_out = df.apply(lambda x: x.groupby(df_group)
.rolling(n+1,min_periods=1)
.sum()
.reset_index(level=0,drop=True))
A B C
0 172770.0 1442.0 114581.0
1 208234.0 68504.0 289866.0
2 159863.0 81356.0 219389.0
3 175007.0 58802.0 233357.0
步骤3让我们屏蔽或替换dfIdx中与0对齐的值,我们可以使用多个
df_out.mul(dfIdx)
如果有帮助的话,下面@ScottBoston提出的解决方案似乎有效,如果我将他的
dfu组
修改为dfIdx.loc[list(reversed(dfIdx.index))].cumsum().loc[dfIdx.index,x.name]
。还有其他建议吗?