스택큐힙리스트

중복된 인덱스를 가지는 판다스 행 제거 본문

카테고리 없음

중복된 인덱스를 가지는 판다스 행 제거

스택큐힙리스트 2023. 3. 30. 20:43
반응형

중복된 인덱스 값이 있는 행을 삭제하는 방법은 무엇인가요?

아래의 기상 데이터프레임에서, 때로는 과학자가 관측치를 바로잡기 위해 행을 편집하는 것이 아니라 중복 행을 파일 끝에 추가함으로써 수행됩니다.

저는 웹에서 자동화된 기상 데이터를 읽고 있습니다 (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 as pd

import datetime

startdate = datetime.datetime(2001, 1, 1, 0, 0)

enddate = datetime.datetime(2001, 1, 1, 5, 0)

index = pd.date_range(start=startdate, end=enddate, freq='H')

data1 = {'A' : range(6), 'B' : range(6)}

data2 = {'A' : [20, -30, 40], 'B' : [-50, 60, -70]}

df1 = pd.DataFrame(data=data1, index=index)

df2 = pd.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

나는 행 번호 열을 추가하면 어떤 값에 대해서도 가장 하단 행을 선택하는 데 도움이 될 것 같았지만, 그것을 작동시키기 위한 문장인 group_by 또는 pivot (또는 ???)을 알아내는 데에 막혔다.

답변 1

판다스 인덱스 자체에 duplicated 방법을 사용하는 것을 제안합니다.

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

다른 모든 방법이 작동하지만, 제공된 예제에서 .drop_duplicates 는 가장 성능이 떨어지는 방법입니다. 게다가, groupby method 은 조금 덜 성능이 좋지만 중복된 방법이 더 읽기 쉽다고 생각합니다.

주어진 샘플 데이터를 사용하여:

>>> %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' 인자를 'last'으로 변경할 수 있다는 것에 유의하세요.

또한, 이 방법은 MultiIndex와 함께도 작동한다는 점에 유의해야 한다 (Paul's example에서 지정한 대로 df1을 사용).

>>> %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

답변 2

이번에는 중복된 인덱스를 가진 판다스 행을 제거하는 방법에 대해 알아보겠습니다. 판다스(Pandas)는 파이썬에서 데이터를 다루는 라이브러리로 널리 사용됩니다. 그러나 때로는 데이터 집합에서 중복된 인덱스가 발생할 수 있습니다. 이러한 경우, 중복된 인덱스를 가진 행은 데이터 분석에 방해가 될 수 있습니다. 이러한 중복된 인덱스를 제거하는 방법에 대해서 살펴보겠습니다.

첫째, 판다스에서 중복된 인덱스를 제거하는 방법 중 하나는 drop_duplicates() 메서드를 사용하는 것입니다. 이 메서드는 데이터프레임의 중복된 행을 제거합니다. 다음은 이를 수행하는 예시입니다.

```

import pandas as pd

# 예시 데이터프레임 생성

df = pd.DataFrame({'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'],

'B': ['one', 'one', 'two', 'two', 'two', 'one', 'one', 'two'],

'C': [1, 1, 2, 3, 3, 4, 5, 6]})

# 중복된 인덱스 제거

df = df[~df.index.duplicated()]

```

위의 예시에서, 먼저 예시 데이터프레임을 생성하였습니다. 그리고, 'index' 속성을 사용하여 중복된 인덱스를 제거하였습니다. 이렇게 제거된 데이터프레임은 중복된 인덱스가 없는 데이터프레임이 됩니다.

둘째, 중복된 인덱스를 제거하는 또 다른 방법은 reset_index() 메서드를 사용하여 인덱스를 재설정하는 것입니다. 다음은 이를 수행하는 예시입니다.

```

import pandas as pd

# 예시 데이터프레임 생성

df = pd.DataFrame({'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'],

'B': ['one', 'one', 'two', 'two', 'two', 'one', 'one', 'two'],

'C': [1, 1, 2, 3, 3, 4, 5, 6]})

# 중복된 인덱스 제거

df = df.reset_index(drop=True)

```

위의 예시에서, 먼저 예시 데이터프레임을 생성하였습니다. 그리고, reset_index() 메서드를 사용하여 인덱스를 재설정하였습니다. 이 메서드를 사용하면 중복된 인덱스가 제거된 데이터프레임을 얻을 수 있습니다.

이상으로, 판다스에서 중복된 인덱스를 제거하는 두 가지 방법에 대해서 알아보았습니다. 이러한 방법을 사용하면 데이터 분석에서 중복된 인덱스를 가지고 있는 데이터를 처리할 수 있습니다.

반응형
Comments