gpt4 book ai didi

python - 带有指标 DataFrame 的累积和 pandas DataFrame

转载 作者:行者123 更新时间:2023-11-30 22:33:18 26 4
gpt4 key购买 nike

我有一个 pandas DataFrame (df),其中包含我想根据另一个具有相同列和索引的 pandas DataFrame (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:

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

我意识到我给出的原始示例没有提供我想要的所有行为示例,因此,建议的解决方案不完整。我用另一行扩充了数据,以提供更多样化的行为。

最佳答案

编辑以满足新的要求和扩展的数据集

df_out = (df.apply(lambda x: x.groupby(dfIdx.loc[::-1,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

额外学分更新:

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 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

注意:使用反转,您的观察结果非常接近。我也在做同样的事情。这完全取决于您如何对 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

对于“额外学分”,其中 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 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 中的分组:

df_group = dfIdx.cumsum()\
.replace(0,pd.np.nan)\
.bfill()

A B C
0 1.0 1.0 1
1 1.0 1.0 1
2 1.0 1.0 1
3 1.0 2.0 1

第 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)

          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

关于python - 带有指标 DataFrame 的累积和 pandas DataFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45191865/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com