首页 > 解决方案 > 在多列中用 np.nan 替换各种重复值

问题描述

我正在尝试replace duplicatecolumns一个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

标签: pythonpandasreplaceduplicates

解决方案


好吧,一种方法是简单地使用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      

objectdtypes。


推荐阅读