带指示器数据帧的累积和Pandas数据帧

2024-09-19 23:27:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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:

^{pr2}$

我希望结果是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

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


Tags: columns信息示例dataframepandasdf时间金额
1条回答
网友
1楼 · 发布于 2024-09-19 23:27:54

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

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

输出:

^{pr2}$

额外学分更新:

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

注意:您使用reversed进行的观察非常接近。我也在做同样的事情。这一切都是关于你如何分组的。在


让我们试试:

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执行“transform”或“rolling”。在

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对齐的值,我们可以使用多个

测向_出去。穆尔(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

相关问题 更多 >