pandas - 仅保留重复列的第一个值(将 0 设置为其他值)

标签 pandas numpy

假设我有以下情况:

第一列 ['ID'] 最终将具有重复值的数据框。

import pandas as pd
df = pd.DataFrame({"ID": [1,2,3,4,4,5,5,5,6,6], 
                  "l_1": [10,12,32,45,45,20,20,20,20,20], 
                  "l_2": [11,12,32,11,21,27,38,12,9,6], 
                  "l_3": [5,9,32,12,21,21,18,12,8,1],
                  "l_4": [6,21,12,77,77,2,2,2,8,8]})


ID  l_1 l_2 l_3 l_4
1   10  11  5   6
2   12  12  9   21
3   32  32  32  12
4   45  11  12  77
4   45  21  21  77
5   20  27  21  2
5   20  38  18  2
5   20  12  12  2
6   20  9   8   8
6   20  6   1   8

出现重复ID时:

  • 我只需要保留列 l_1l_4 的第一个值(其他重复的行必须为零)。
  • 列“l_2”和“l_3”必须保持不变。
  • 当 ID 重复时,l_1 和 l_4 列的这些行上的值也将重复。

预期输出:

ID  l_1 l_2 l_3 l_4
1   10  11  5   6
2   12  12  9   21
3   32  32  32  12
4   45  11  12  77
4   0   21  21  0
5   20  27  21  2
5   0   38  18  0
5   0   12  12  0
6   20  9   8   8
6   0   6   1   0

是否有使用 pandas 或 numpy 的直接方法来完成此操作?

我可以完成所有这些步骤:

x1 = df[df.duplicated(subset=['ID'], keep=False)].copy()

x1.loc[x1.groupby('ID')['l_1'].apply(lambda x: (x.shift(1) == x)), 'l_1'] = 0

x1.loc[x1.groupby('ID')['l_4'].apply(lambda x: (x.shift(1) == x)), 'l_4'] = 0

df = df.drop_duplicates(subset=['ID'], keep=False)

df = pd.concat([df, x1])

最佳答案

这不就是:

df.loc[df.duplicated('ID'), ['l_1','l_4']] = 0

输出:

   ID  l_1  l_2  l_3  l_4
0   1   10   11    5    6
1   2   12   12    9   21
2   3   32   32   32   12
3   4   45   11   12   77
4   4    0   21   21    0
5   5   20   27   21    2
6   5    0   38   18    0
7   5    0   12   12    0
8   6   20    9    8    8
9   6    0    6    1    0

关于pandas - 仅保留重复列的第一个值(将 0 设置为其他值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65093872/

相关文章:

python - Pandas中双大括号 `[[...]]`和单大括号 `[..]`索引的区别

python - 使用 python pandas 如何进行以下分析

python - 为什么 Pandas 将日期时间转换为聚合函数中的 float

python - 使用 Numpy 进行交易

python - 使用 numpy 忽略多个变量(包括函数)

python - 在 python 中将 numpy ndarray 转换为字符串的更智能、更快速的方法

pandas - dask 读取 Parquet 并指定架构

python - 在 pandas 中使用下采样的另一种方法

python - 使用 PyArray_SimpleNewFromData() 创建并返回数组时 Python 扩展中的内存泄漏

python - 如何获取将数据帧写入 Python 的 R 代码