如何对数据框中的前几行求和?

How to sum previous rows in a dataframe?

我不确定如何正确表达我想做的事情,或者这是否可能,如果这听起来令人困惑且没有意义,我深表歉意。我想做的基本上是在数据框中创建一个单独的列来对连续值求和的方法。例如,我有如下所示的这一列,我想要一个单独的列,其中包含 0.00871 和 0.001 的总和,然后是 0.000603 和 0.0123,以及 0.000871 和 4.37E-05,等等。这有意义吗?如果是这样,有没有一种方法可以为此编写代码,而不是手动执行?感谢所有帮助!我更愿意在 Python 上执行此操作,但任何语言都可以。

Not allowed to embed the image, so hopefully this works

  • 鉴于您的数据以图像形式呈现,我已经对其进行了模拟
  • 你说的
    1. 每隔一行 d.index % 2
    2. 将当前行和上一行相加 d["sourceValue"] + d["sourceValue"].shift()
import numpy as np
import pandas as pd

pd.DataFrame({"sourceValue": np.random.uniform(0, 1, 30)}).assign(
    required=lambda d: np.where(
        d.index % 2, d["sourceValue"] + d["sourceValue"].shift(), np.nan
    )
)
sourceValue required
0 0.804529 nan
1 0.24858 1.05311
2 0.710556 nan
3 0.415231 1.12579
4 0.879645 nan
5 0.599331 1.47898
6 0.635365 nan
7 0.587647 1.22301
8 0.902475 nan
9 0.0398323 0.942307
10 0.357436 nan
11 0.469155 0.826591
12 0.732759 nan
13 0.721996 1.45476
14 0.030494 nan
15 0.0047623 0.0352563
16 0.01081 nan
17 0.130903 0.141713
18 0.643588 nan
19 0.837585 1.48117
20 0.63328 nan
21 0.506582 1.13986
22 0.855085 nan
23 0.100174 0.95526
24 0.146992 nan
25 0.64605 0.793041
26 0.460859 nan
27 0.818967 1.27983
28 0.809294 nan
29 0.664239 1.47353

补充-多列

import numpy as np
import pandas as pd

df = pd.DataFrame({f"sourceValue{i+1}": np.random.uniform(0, 1, 30) for i in range(7)})

# static version
df["targetValue1"] = np.where(df.index%2, df["sourceValue1"]+df["sourceValue1"].shift(), np.nan)
df["targetValue2"] = np.where(df.index%2, df["sourceValue2"]+df["sourceValue2"].shift(), np.nan)
df["targetValue3"] = np.where(df.index%2, df["sourceValue3"]+df["sourceValue3"].shift(), np.nan)
df["targetValue4"] = np.where(df.index%2, df["sourceValue4"]+df["sourceValue4"].shift(), np.nan)
df["targetValue5"] = np.where(df.index%2, df["sourceValue5"]+df["sourceValue5"].shift(), np.nan)
df["targetValue6"] = np.where(df.index%2, df["sourceValue6"]+df["sourceValue6"].shift(), np.nan)
df["targetValue7"] = np.where(df.index%2, df["sourceValue7"]+df["sourceValue7"].shift(), np.nan)

# dynamic version
df = df.assign(**{c.replace("source", "target"): 
                  np.where(df.index % 2, df[c] + df[c].shift(), np.nan)
                  for c in df.columns if "sourceValue" in c})

df

要获得累计和,请使用 -

df.cumsum()