Замените различные повторяющиеся значения с помощью np.nan в нескольких столбцах. - PullRequest
3 голосов
/ 24 апреля 2019

Я пытаюсь 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

Ответы [ 2 ]

2 голосов
/ 24 апреля 2019

Ну, один из способов - просто использовать 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

dtypes float.Теперь с частью 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.

1 голос
/ 24 апреля 2019

Я использую where с diff

df[['Val_D', 'Val_M']].where(df[['Val_D', 'Val_M']].diff().ne(0))
Out[1136]: 
   Val_D  Val_M
0   10.0  100.0
1    NaN    NaN
2    NaN    NaN
3   22.0    NaN
4    NaN    NaN
5   10.0  240.0
6    NaN    NaN
7    NaN    NaN
df[['Val_D', 'Val_M']]= df[['Val_D', 'Val_M']].where(df[['Val_D', 'Val_M']].diff().ne(0))
...