Эквивалентность Stata drop дублирует код в Python - PullRequest
0 голосов
/ 02 октября 2018

Я пытаюсь перевести некоторый код на Python из Stata.Следующий код используется для отбрасывания повторяющихся наблюдений для одной и той же переменной id в той же date:

quietly by id date: gen dup = cond(_N==1,0,_n) 
drop if id >= 1

Приведенный ниже код используется для создания образца набора данных Python.То, что делает приведенный выше код в Stata, - это удаление дублирующих наблюдений.Например, date 2014-05-01, id 1 имеет одинаковые данные в два раза, а также date 2014-05-02, id 2 и т. Д. Однако мне нужны только данныепоявиться один раз.Может кто-нибудь знает эквивалентный код в Python?

data = {'date': ['2014-05-01', '2014-05-01','2014-05-01','2014-05-01','2014-05-01',
             '2014-05-02','2014-05-02','2014-05-02','2014-05-02','2014-05-03',
             '2014-05-03','2014-05-03','2014-05-03'],'id':[1, 1, 2, 3, 4, 1, 2,
             2, 3, 1, 1, 2, 3],'obs': [10, 10, 5, 7, 3, 2, 4, 4, 3, 8, 8, 6, 11]}

df1 = pd.DataFrame(data, columns = ['date', 'id','obs'])
df1.index = df1['date']
del df1['date']

df1

Исходные данные

Out[1]: 

           id  obs
date               
2014-05-01   1   10
2014-05-01   1   10
2014-05-01   2    5
2014-05-01   3    7
2014-05-01   4    3
2014-05-02   1    2
2014-05-02   2    4
2014-05-02   2    4
2014-05-02   3    3
2014-05-03   1    8
2014-05-03   1    8
2014-05-03   2    6
2014-05-03   3   11

Требуемые данные

Out[2]:

            id  obs
date               
2014-05-01   1   10
2014-05-01   2    5
2014-05-01   3    7
2014-05-01   4    3
2014-05-02   1    2
2014-05-02   2    4
2014-05-02   3    3
2014-05-03   1    8
2014-05-03   2    6
2014-05-03   3   11

1 Ответ

0 голосов
/ 02 октября 2018

Идея состоит в том, чтобы создать столбец из индекса по reset_index, а затем использовать DataFrame.duplicated с boolean indexing или создать MultiIndex по set_index и используйте Index.duplicated:

df1 = df1[~df1.reset_index().duplicated(subset=['date','id']).values]
#alternative
#df1 = df1[~df1.set_index('id', append=True).index.duplicated()]
print (df1)
            id  obs
date               
2014-05-01   1   10
2014-05-01   2    5
2014-05-01   3    7
2014-05-01   4    3
2014-05-02   1    2
2014-05-02   2    4
2014-05-02   3    3
2014-05-03   1    8
2014-05-03   2    6
2014-05-03   3   11
...