Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 数据帧与指示符数据帧的累计和_Python_Python 3.x_Pandas - Fatal编程技术网

Python 数据帧与指示符数据帧的累计和

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 =

我有一个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 = 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]
。还有其他建议吗?