본문 바로가기
파이썬

파이썬 Remove rows with duplicate indices (Pandas DataFrame and TimeSeries)

by º기록 2021. 2. 3.
반응형

웹에서 자동화 된 날씨 데이터를 읽고 있습니다. 관측은 5 분마다 발생하며 각 기상 관측소의 월별 파일로 컴파일됩니다. 파일 구문 분석이 완료되면 DataFrame은 다음과 같습니다.

                      Sta  Precip1hr  Precip5min  Temp  DewPnt  WindSpd  WindDir  AtmPress
Date                                                                                      
2001-01-01 00:00:00  KPDX          0           0     4       3        0        0     30.31
2001-01-01 00:05:00  KPDX          0           0     4       3        0        0     30.30
2001-01-01 00:10:00  KPDX          0           0     4       3        4       80     30.30
2001-01-01 00:15:00  KPDX          0           0     3       2        5       90     30.30
2001-01-01 00:20:00  KPDX          0           0     3       2       10      110     30.28

내가 가진 문제는 때때로 과학자가 잘못된 행을 편집하는 것이 아니라 파일 끝에 중복 행을 추가하여 관찰을 수정한다는 것입니다. 이러한 경우의 간단한 예는 다음과 같습니다.

import pandas 
import datetime
startdate = datetime.datetime(2001, 1, 1, 0, 0)
enddate = datetime.datetime(2001, 1, 1, 5, 0)
index = pandas.DatetimeIndex(start=startdate, end=enddate, freq='H')
data1 = {'A' : range(6), 'B' : range(6)}
data2 = {'A' : [20, -30, 40], 'B' : [-50, 60, -70]}
df1 = pandas.DataFrame(data=data1, index=index)
df2 = pandas.DataFrame(data=data2, index=index[:3])
df3 = df2.append(df1)
df3
                       A   B
2001-01-01 00:00:00   20 -50
2001-01-01 01:00:00  -30  60
2001-01-01 02:00:00   40 -70
2001-01-01 03:00:00    3   3
2001-01-01 04:00:00    4   4
2001-01-01 05:00:00    5   5
2001-01-01 00:00:00    0   0
2001-01-01 01:00:00    1   1
2001-01-01 02:00:00    2   2

그래서 결국 df3 이 필요합니다.

                       A   B
2001-01-01 00:00:00    0   0
2001-01-01 01:00:00    1   1
2001-01-01 02:00:00    2   2
2001-01-01 03:00:00    3   3
2001-01-01 04:00:00    4   4
2001-01-01 05:00:00    5   5

행 번호 열 ( df3 [ 'rownum'] = range (df3.shape [0]) )을 추가하면 <의 모든 값에 대해 맨 아래 행을 선택하는 데 도움이된다고 생각했습니다. code> DatetimeIndex ,하지만 group_by 또는 pivot (또는 ???) 문을 찾아야합니다.

 

해결 방법

 


df3 = df3[~df3.index.duplicated(keep='first')]


제공된 샘플 데이터 사용 :

>>> %timeit df3.reset_index().drop_duplicates(subset='index', keep='first').set_index('index')
1000 loops, best of 3: 1.54 ms per loop

>>> %timeit df3.groupby(df3.index).first()
1000 loops, best of 3: 580 µs per loop

>>> %timeit df3[~df3.index.duplicated(keep='first')]
1000 loops, best of 3: 307 µs per loop

keep 인수를 변경하여 마지막 요소를 유지할 수 있습니다.


>>> %timeit df1.groupby(level=df1.index.names).last()
1000 loops, best of 3: 771 µs per loop

>>> %timeit df1[~df1.index.duplicated(keep='last')]
1000 loops, best of 3: 365 µs per loop

 

참조 페이지 https://stackoverflow.com/questions/13035764

 

 

반응형

댓글