Pandas / Python 中的数据校正

问题描述 投票:0回答:1

我需要使用从数据帧的子集计算出的值来更新 df 子集的数据。

人员NR XYZ 日期 价值
22222 a 一月 0,8
22222 b 一月 0,2
22222 a 二月 0,8
22222 b 二月 0,2

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

对于我已经知道的子集(我有一个 PERSNR 列表来过滤它),我需要将值添加在一起,忽略 XYZ

我可以用pivot_table做到这一点,并且可以从中得到另一个df。

我遇到的问题是,我需要随后更新原始 DF 中的值。

我的目标是获得以下内容而不丢失我的 DF 的任何其他数据。

人员NR XYZ 日期 价值
22222 a 一月 1,0
22222 b 一月 0,0

在 Excel 中,我会对我的 PERSNR、XYZ 和日期的值列进行求和。

然后我将在“值”列中用 vlookup 替换我的值,并用零覆盖标识符 XYZ“b”的值。这将永远为零。

关于如何做到这一点有什么建议吗?

提前致谢

迈克

python pandas data-cleaning
1个回答
0
投票

假设有这样的数据框:

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
    设置列
    0
    ,其中
    df["XYZ"] == "b"

  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
© www.soinside.com 2019 - 2024. All rights reserved.