Pandas/Python中的数据修正
我需要更新我的数据框(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
合并两个数据框:(i) 原始数据框去掉
VALUE
这一列,(ii) 另一个数据框,按PERSNR
分组(假设这个字段会有多个值;如果没有,就不需要这个字段)和DATE
,然后对每个组里的VALUE
进行求和,并重置索引。把
VALUE
这一列中,df["XYZ"] == "b"
的地方设置为0
。使用
.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