我试图想出一些代码,基本上可以计算其下方位置的累积值。采用累积总和几乎可以完成此任务,但某些位置对相同的下游点有贡献。此外,最上游的点(或起始点)不会有任何贡献值,并且可以在最终的累积 DataFrame 中保留其起始值。
假设每个站点都有以下 DataFrame。
df = pd.DataFrame({
"Site 1": np.random.rand(10),
"Site 2": np.random.rand(10),
"Site 3": np.random.rand(10),
"Site 4": np.random.rand(10),
"Site 5": np.random.rand(10)})
我还有一个数据表,其中包含每个站点及其相应的下游组件。
df_order = pd.DataFrame({
"Site 1": Site 3,
"Site 2": Site 3,
"Site 3": Site 4,
"Site 4": Site 5,
"Site 5": None})
我想做以下事情:
1) 对上游值求和以获得相应下游值的累积和。例如,站点 1 和站点 2 对站点 3 的价值有贡献。因此,我想将站点 1、站点 2 和站点 3 加在一起以获得站点 3 的累积值。
2) 现在我在站点 3 上有了该累积值,我想将该累积值保存到站点 3 的“df”中。现在我想将该值传播到站点 4,通过更新 DataFrame 保存它,然后继续到站点 5。
我可以使用 cumsum 来获得每个站点的累积值,如下所示:
df = df.cumsum(axis=1)
但是,这并没有考虑到站点 1 和站点 2 正在为站点 3 做出贡献,而不是彼此之间。
好吧,我可以使用以下方法手动解决这个问题:
df['Site 3'] = df.loc[:,'Site 1':'Site 3'].sum(axis = 1)
df['Site 4'] = df.loc[:,'Site 3':'Site 4'].sum(axis = 1)
df['Site 5'] = df.loc[:,'Site 4':'Site 5'].sum(axis = 1)
但是,我的实际站点列表要广泛得多,并且手动方法不会自动考虑提供的“df_order”。有没有办法以可以自动计算的方式逻辑链接“df_order”DataFrame?我知道如何手动执行此操作,我将如何扩展它以能够处理更大的 DataFrame 和站点顺序?
考虑一个更大的 DataFrame,可能多达 50 个站点,如下所示:
df_order = pd.DataFrame({
"Site 1": Site 3,
"Site 2": Site 3,
"Site 3": Site 4,
"Site 4": Site 5,
"Site 5": Site 8,
"Site 6": Site 8,
"Site 7": Site 8,
"Site 8": Site 9,
"Site 9": None})