我正在尝试在 replace duplicate 中跨多个 columns pandas df 值。对于下面的 df,我有对应于这些日期的日期和值。每个日期的所有值都相同。我只想保留每个日期的第一个值,并将以下 duplicate 值替换为 np.nan 。以下是我的尝试:

import pandas as pd
import numpy as np

d = ({
    'Date' : ['1/1/18','1/1/18','1/1/18','2/1/18','2/1/18','3/2/18','3/2/18','3/2/18'],
    'Val_D' : [10,10,10,22,22,10,10,10],
    'Val_M' : [100,100,100,100,100,240,240,240],
     })

df = pd.DataFrame(data = d)

df['Date'] = pd.to_datetime(df['Date'], format= '%d/%m/%y')

pd.Series([10,22,100,240]).duplicated()
dup = df.apply(pd.Series.duplicated, axis = 1)
df = df.where(~dup,np.nan)

print(df)

预期输出:
     Date Val_D Val_M
0  1/1/18    10   100
1  1/1/18
2  1/1/18
3  2/1/18    22
4  2/1/18
5  3/2/18    10   240
6  3/2/18
7  3/2/18

最佳答案

嗯,一种方法是简单地使用 diff + ne

s = df[['Val_D', 'Val_M']]
df[['Val_D', 'Val_M']] = s[s.diff().ne(0)].fillna('')

即使这会产生您预期的输出,列的 dtypes 也会变成 object 并且您会失去对数字的矢量化能力。所以我建议你不要这样做。没有最后一块 fillna('') ,你会得到
    Date        Val_D   Val_M
0   2018-01-01  10.0    100.0
1   2018-01-01  NaN     NaN
2   2018-01-01  NaN     NaN
3   2018-01-02  22.0    NaN
4   2018-01-02  NaN     NaN
5   2018-02-03  10.0    240.0
6   2018-02-03  NaN     NaN
7   2018-02-03  NaN     NaN
dtypesfloat 。现在,使用 fillna('') 片段,您将获得
    Date        Val_D   Val_M
0   2018-01-01  10      100
1   2018-01-01
2   2018-01-01
3   2018-01-02  22
4   2018-01-02
5   2018-02-03  10      240
6   2018-02-03
7   2018-02-03

使用 object dtypes。

关于python - 在多列中用 np.nan 替换各种重复值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55821527/

10-13 04:06