Pandas 데이터 프레임의 마지막 데이터 행을 삭제하는 방법


104

나는 이것이 간단해야한다고 생각하지만 몇 가지 아이디어를 시도했지만 그중 어느 것도 작동하지 않았습니다.

last_row = len(DF)
DF = DF.drop(DF.index[last_row])  #<-- fail!

음수 인덱스를 사용해 보았지만 오류가 발생했습니다. 나는 여전히 기본적인 것을 오해하고있을 것입니다.


27
DF = DF[:-1]?
U2EF1 2014

@ U2EF1 이것은 전체 데이터 세트를 복사하지 않습니까? 대용량 데이터를 처리 할 때 문제가 될 수 있습니다.
ManuelSchneid3r

답변:


163

마지막 n 개 행을 삭제하려면 :

df.drop(df.tail(n).index,inplace=True) # drop last n rows

같은 맥락에서 처음 n 개의 행을 삭제할 수 있습니다.

df.drop(df.head(n).index,inplace=True) # drop first n rows

마지막 열을 삭제하려면 df.drop (df.columns [-1], axis = 1, inplace = True)를 사용하거나 열 이름을 알고있는 경우 df.drop (columns = [ 'col_name)을 사용할 수 있습니다. '], inplace = True)-제자리에서 수행하지 않으려면 새 변수에 할당하고 해당 인수를 제거합니다.
Shawn Schreier

78
DF[:-n]

여기서 n은 삭제할 마지막 행 수입니다.

마지막 행을 삭제하려면 :

DF = DF[:-1]

58

파이썬 인덱스 위치가 계 0이므로, 실제의 요소가되지 index위치에 대응에 len(DF). 당신은 그것이 필요합니다 last_row = len(DF) - 1:

In [49]: dfrm
Out[49]: 
          A         B         C
0  0.120064  0.785538  0.465853
1  0.431655  0.436866  0.640136
2  0.445904  0.311565  0.934073
3  0.981609  0.695210  0.911697
4  0.008632  0.629269  0.226454
5  0.577577  0.467475  0.510031
6  0.580909  0.232846  0.271254
7  0.696596  0.362825  0.556433
8  0.738912  0.932779  0.029723
9  0.834706  0.002989  0.333436

[10 rows x 3 columns]

In [50]: dfrm.drop(dfrm.index[len(dfrm)-1])
Out[50]: 
          A         B         C
0  0.120064  0.785538  0.465853
1  0.431655  0.436866  0.640136
2  0.445904  0.311565  0.934073
3  0.981609  0.695210  0.911697
4  0.008632  0.629269  0.226454
5  0.577577  0.467475  0.510031
6  0.580909  0.232846  0.271254
7  0.696596  0.362825  0.556433
8  0.738912  0.932779  0.029723

[9 rows x 3 columns]

그러나 작성하는 것이 훨씬 더 간단합니다 DF[:-1].


2
dfrm.index를 사용하여 삭제할 때 마지막 행의 색인은 고유해야합니다. 그렇지 않으면 해당 색인이있는 모든 행이 삭제됩니다.
FranciscoD

drop (inplace = True)을 사용하면 기존 df를 수정하고 df [:-1]을 사용하면 나중에 SettingWithCopyWarning으로 이어질 수있는 데이터보기를 얻을 수 있다는 것을 올바르게 이해하고 있습니까?
Philipp

21

놀랍게도 아무도 이것을 가져 오지 않았습니다.

# To remove last n rows
df.head(-n)

# To remove first n rows
df.tail(-n)

1000 행의 DataFrame에서 속도 테스트를 실행하면 슬라이싱 및 head/ taildrop다음을 사용하는 것보다 ~ 6 배 빠릅니다 .

>>> %timeit df[:-1]
125 µs ± 132 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

>>> %timeit df.head(-1)
129 µs ± 1.18 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

>>> %timeit df.drop(df.tail(1).index)
751 µs ± 20.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

아마도 둘 사이의 차이이다 접근 head()tail()크리에이트 볼 수 있는 반면 drop(), 실제로 메모리에 표현 변경 (중 올바른 위치를 변경하거나, 완전히 새로운 dataframe를 생성). 나는 이것을 문서에서 찾지 못했습니다. 누군가 제발. (그게 차이라면 : 성능 차이에 대한 좋은 설명, 그리고 신중하게 선택해야합니다) /
Dr. Jan-Philip Gehrcke

@ Dr.Jan-PhilipGehrcke 헤드 head, tail그리고 drop모든 수익 전망, 그것은 그 사실 비록 drop당신이 원래 dataframe의 올바른 위치를 수정할 수있는 옵션을 제공합니다.
theGirrafish

5
stats = pd.read_csv("C:\\py\\programs\\second pandas\\ex.csv")

통계의 출력 :

       A            B          C
0   0.120064    0.785538    0.465853
1   0.431655    0.436866    0.640136
2   0.445904    0.311565    0.934073
3   0.981609    0.695210    0.911697
4   0.008632    0.629269    0.226454
5   0.577577    0.467475    0.510031
6   0.580909    0.232846    0.271254
7   0.696596    0.362825    0.556433
8   0.738912    0.932779    0.029723
9   0.834706    0.002989    0.333436

그냥 사용 skipfooter=1

skipfooter : int, 기본값 0

건너 뛸 파일 하단의 줄 수

stats_2 = pd.read_csv("C:\\py\\programs\\second pandas\\ex.csv", skipfooter=1, engine='python')

stats_2의 출력

       A          B            C
0   0.120064    0.785538    0.465853
1   0.431655    0.436866    0.640136
2   0.445904    0.311565    0.934073
3   0.981609    0.695210    0.911697
4   0.008632    0.629269    0.226454
5   0.577577    0.467475    0.510031
6   0.580909    0.232846    0.271254
7   0.696596    0.362825    0.556433
8   0.738912    0.932779    0.029723

1

drop은 새 배열을 반환하므로 og post에서 질식했습니다. 일부 열 헤더의 이름을 바꾸고 Dataframe으로 변환 된 잘못된 형식의 csv 파일로 인해 일부 행을 삭제해야하는 유사한 요구 사항이 있었으므로이 게시물을 읽은 후 다음을 사용했습니다.

newList = pd.DataFrame(newList)
newList.columns = ['Area', 'Price']
print(newList)
# newList = newList.drop(0)
# newList = newList.drop(len(newList))
newList = newList[1:-1]
print(newList)

위의 주석 처리 된 두 줄에서 볼 수 있듯이 훌륭하게 작동했습니다. 저는 drop. () 메서드를 사용해 보았지만 작동하지만 [n : -n]을 사용하는 것만 큼 쿨하고 읽기 어렵습니다. 누군가에게 도움이되기를 바랍니다. 감사합니다.


0

다중 인덱스 (예 : "Stock"및 "Date")가 있고 마지막 Stock의 마지막 행뿐 아니라 각 Stock에 대한 마지막 행을 제거하려는보다 복잡한 DataFrame의 경우 솔루션은 다음과 같습니다.

# To remove last n rows
df = df.groupby(level='Stock').apply(lambda x: x.head(-1)).reset_index(0, drop=True)

# To remove first n rows
df = df.groupby(level='Stock').apply(lambda x: x.tail(-1)).reset_index(0, drop=True)

(가)로 groupby()다중 색인에 추가 수준을 추가 우리는 단지 사용 끝에 놓습니다 reset_index(). 결과 df는 작업 전과 동일한 유형의 다중 인덱스를 유지합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.