Pandas - 用 Nan 替换重复项并保持行

Sta*_*cks 3 python pandas

如何在保留行的同时用 NaN 替换每个组的重复项?

我需要保留行而不删除并且可能保留第一个原始值首先出现的位置。

import pandas as pd
from datetime import timedelta

df = pd.DataFrame({
    'date': ['2019-01-01 00:00:00','2019-01-01 01:00:00','2019-01-01 02:00:00', '2019-01-01 03:00:00',
             '2019-09-01 02:00:00','2019-09-01 03:00:00','2019-09-01 04:00:00', '2019-09-01 05:00:00'],
    'value': [10,10,10,10,12,12,12,12],
    'ID': ['Jackie','Jackie','Jackie','Jackie','Zoop','Zoop','Zoop','Zoop',]
})

df['date'] = pd.to_datetime(df['date'], infer_datetime_format=True)


date    value   ID
0   2019-01-01 00:00:00 10  Jackie
1   2019-01-01 01:00:00 10  Jackie
2   2019-01-01 02:00:00 10  Jackie
3   2019-01-01 03:00:00 10  Jackie
4   2019-09-01 02:00:00 12  Zoop
5   2019-09-01 03:00:00 12  Zoop
6   2019-09-01 04:00:00 12  Zoop
7   2019-09-01 05:00:00 12  Zoop
Run Code Online (Sandbox Code Playgroud)

所需的数据帧:

date    value   ID
0   2019-01-01 00:00:00 10  Jackie
1   2019-01-01 01:00:00 NaN Jackie
2   2019-01-01 02:00:00 NaN Jackie
3   2019-01-01 03:00:00 NaN Jackie
4   2019-09-01 02:00:00 12  Zoop
5   2019-09-01 03:00:00 NaN Zoop
6   2019-09-01 04:00:00 NaN Zoop
7   2019-09-01 05:00:00 NaN Zoop
Run Code Online (Sandbox Code Playgroud)

编辑:

重复的值应该只在与频率无关的同一日期删除。因此,如果值 10 在 1 月 1 日出现两次,在 1 月 2 日出现 3 次,则值 10 应该只在 1 月 1 日和 1 月 2 日出现一次。

And*_* L. 5

我想你检查列重复valueID进一步检查的datedate

df.loc[df.assign(d=df.date.dt.date).duplicated(['value','ID', 'd']), 'value'] = np.nan

Out[269]:
                 date  value      ID
0 2019-01-01 00:00:00   10.0  Jackie
1 2019-01-01 01:00:00    NaN  Jackie
2 2019-01-01 02:00:00    NaN  Jackie
3 2019-01-01 03:00:00    NaN  Jackie
4 2019-09-01 02:00:00   12.0    Zoop
5 2019-09-01 03:00:00    NaN    Zoop
6 2019-09-01 04:00:00    NaN    Zoop
7 2019-09-01 05:00:00    NaN    Zoop
Run Code Online (Sandbox Code Playgroud)

正如@Trenton 建议的那样,您可以使用pd.NA来避免导入 numpy

注意:正如@rafaelc 建议的那样:这里是解释pd.NAnp.nan https://pandas.pydata.org/pandas-docs/stable/whatsnew/v1.0.0.html#experimental-na-scalar-to-denote之间的详细差异的链接- 缺失值)

df.loc[df.assign(d=df.date.dt.date).duplicated(['value','ID', 'd']), 'value'] = pd.NA

Out[273]:
                 date value      ID
0 2019-01-01 00:00:00    10  Jackie
1 2019-01-01 01:00:00  <NA>  Jackie
2 2019-01-01 02:00:00  <NA>  Jackie
3 2019-01-01 03:00:00  <NA>  Jackie
4 2019-09-01 02:00:00    12    Zoop
5 2019-09-01 03:00:00  <NA>    Zoop
6 2019-09-01 04:00:00  <NA>    Zoop
7 2019-09-01 05:00:00  <NA>    Zoop
Run Code Online (Sandbox Code Playgroud)

  • 您可以使用“pd.NA”,因此仅“np.nan”不需要导入 numpy。 (3认同)
  • 可能值得补充的是,“pd.NA”和“np.nan”可能有非常不同的行为。它们不一定可以互换 (3认同)
  • @rafaelc:添加了解释“pd.NA”和“np.nan”之间差异的链接 (2认同)
  • 我只是在玩“pd.NA”,并意识到在创建“ints”或“floats”列时,“pd.NA”会导致该列成为“object”类型。同样,“pd.NA”强制“value”的“type”变成“object”。因此,我撤回我的建议。 (2认同)