Pandas/Python中的数据修正

2 投票
1 回答
66 浏览
提问于 2025-04-14 16:18

我需要更新我的数据框(df)中的一部分数据,这些数据是根据数据框中的另一部分计算得出的。

PERSNR XYZ DATE VALUE
22222 a 一月 0.8
22222 b 一月 0.2
22222 a 二月 0.8
22222 b 二月 0.2

我有一个数据框,里面有大约8000个PERSNR,看起来像这样,只是列更多。

对于我已经知道的一个子集(我有一个PERSNR的列表来过滤),我需要把这些值加起来,忽略XYZ这一列。

我可以用透视表(pivot_table)来做到这一点,并从中得到另一个数据框。

我现在的问题是,我需要在原始数据框中更新这些值。

我的目标是得到下面这个结果,同时不丢失数据框中的其他数据。

PERSNR XYZ DATE VALUE
22222 a 一月 1.0
22222 b 一月 0.0

在Excel中,我会对我的VALUE列进行条件求和(sumifs),根据PERSNR、XYZ和DATE来计算。

然后,我会用查找(vlookup)来替换VALUE列中的值,并把标识符XYZ为“b”的值覆盖为零。这些值总是会是零。

有没有什么建议可以做到这一点?

谢谢!

迈克

1 个回答

1

假设你有一个这样的数据框:

data = {
    "PERSNR": [22222, 22222, 22222, 22222, 55555, 55555],
    "XYZ": ["a", "b", "a", "b", "a", "b"],
    "DATE": ["Jan", "Jan", "Feb", "Feb", "Jan", "Jan"],
    "VALUE": [0.8, 0.2, 0.8, 0.2, 0.8, 0.2],
}
   PERSNR XYZ DATE  VALUE
0   22222   a  Jan    0.8
1   22222   b  Jan    0.2
2   22222   a  Feb    0.8
3   22222   b  Feb    0.2
4   55555   a  Jan    0.8
5   55555   b  Jan    0.2
  1. 合并两个数据框:(i) 原始数据框去掉 VALUE 这一列,(ii) 另一个数据框,按 PERSNR 分组(假设这个字段会有多个值;如果没有,就不需要这个字段)和 DATE,然后对每个组里的 VALUE 进行求和,并重置索引。

  2. VALUE 这一列中,df["XYZ"] == "b" 的地方设置为 0

  3. 使用 .loc 只对选定的 PERSNR 值执行之前的步骤。

selected_persnr = [22222]  # add all selected values here

df.loc[df["PERSNR"].isin(selected_persnr)] = pd.merge(
    df.drop(columns="VALUE"),
    df.groupby(["PERSNR", "DATE"])["VALUE"].sum().reset_index(),
)
df.loc[(df["PERSNR"].isin(selected_persnr)) & (df["XYZ"] == "b"), "VALUE"] = 0
   PERSNR XYZ DATE  VALUE
0   22222   a  Jan    1.0
1   22222   b  Jan    0.0
2   22222   a  Feb    1.0
3   22222   b  Feb    0.0
4   55555   a  Jan    0.8
5   55555   b  Jan    0.2

撰写回答