Pandas 데이터 프레임에서 행 목록을 삭제하는 방법은 무엇입니까?


258

데이터 프레임 df가 있습니다.

>>> df
                  sales  discount  net_sales    cogs
STK_ID RPT_Date                                     
600141 20060331   2.709       NaN      2.709   2.245
       20060630   6.590       NaN      6.590   5.291
       20060930  10.103       NaN     10.103   7.981
       20061231  15.915       NaN     15.915  12.686
       20070331   3.196       NaN      3.196   2.710
       20070630   7.907       NaN      7.907   6.459

그런 다음 목록에 표시된 특정 시퀀스 번호가있는 행을 삭제하고 싶습니다 [1,2,4],.

                  sales  discount  net_sales    cogs
STK_ID RPT_Date                                     
600141 20060331   2.709       NaN      2.709   2.245
       20061231  15.915       NaN     15.915  12.686
       20070630   7.907       NaN      7.907   6.459

어떻게 또는 어떤 기능을 수행 할 수 있습니까?


명확히하기 위해이 질문은 특정 인덱스 값으로 행을 삭제하는 것에 관한 것입니다. [1,2,4]의 사용은 삭제 후 남은 행을 가리키는 것 입니다. 아래에 이것을 수행하는 답변이 있습니다.
연금술

답변:


386

DataFrame.drop을 사용 하여 일련의 색인 레이블을 전달하십시오.

In [65]: df
Out[65]: 
       one  two
one      1    4
two      2    3
three    3    2
four     4    1


In [66]: df.drop(df.index[[1,3]])
Out[66]: 
       one  two
one      1    4
three    3    2

18
마지막 행을 삭제 df.drop 또한 +1 (df.tail 1있는 .index)
나세르 알 Wohaibi

15
이 답변은 df.index.unique ()가 df.index와 동일하고 Pandas DataFrame의 요구 사항이 아닌 경우에만 작동합니다. df.index 값이 고유하지 않을 때 해결책이 있습니까?
J Jones

2
이것은 인덱스 이름 자체를 인덱스 할 수 없습니다
ingrid

45
예를 들어, 사람들은 명확하게하려면 행과 열에 동일한 문자열을 사용하지 마십시오. 그것은 이미 자신의 물건을 이미 알고있는 사람들에게 좋습니다. 배우려고하는 사람들에게 실망.
gseattle

2
파이썬 신규 이민자 :이 행을 삭제하고 같은 dataframe (인플레 이스)에 저장하려는 경우 당신은 또한 추가 할 필요가 있습니다 axis=0(0 = 행, 1 = 열)와 inplace=True같이가 df.drop(df.index[[1,3]], axis=0, inplace=True). @mezzanaccio, 교체하려는 인덱스를 구체적으로 알고있는 경우 (또한 0에서 n까지의 예제를 사용하는 경우) :df.drop(df.index[range(0, n)], axis=0, inplace=True)
mrbTT


47

DataFrame이 크고 삭제할 행 수가 많으면 간단한 인덱스 별 삭제에 df.drop(df.index[])너무 많은 시간이 걸립니다.

필자의 경우 다중 인덱싱 된 DataFrame with with floats를 사용하여 행 100M rows x 3 cols을 제거해야 10k합니다. 내가 찾은 가장 빠른 방법은 직관적으로 take나머지 행에 반하는 것 입니다.

indexes_to_drop드롭 할 위치 인덱스 배열 ( [1, 2, 4]문제에서)을 보자 .

indexes_to_keep = set(range(df.shape[0])) - set(indexes_to_drop)
df_sliced = df.take(list(indexes_to_keep))

내 경우에는이 걸렸다 20.5s단순한는 동안 df.drop했다 5min 27s및 메모리를 많이 소비했다. 결과 DataFrame은 동일합니다.


43

당신은 또한에 전달할 수있는 DataFrame.drop 라벨 자체 (대신 인덱스 라벨 시리즈) :

In[17]: df
Out[17]: 
            a         b         c         d         e
one  0.456558 -2.536432  0.216279 -1.305855 -0.121635
two -1.015127 -0.445133  1.867681  2.179392  0.518801

In[18]: df.drop('one')
Out[18]: 
            a         b         c         d         e
two -1.015127 -0.445133  1.867681  2.179392  0.518801

다음과 같습니다.

In[19]: df.drop(df.index[[0]])
Out[19]: 
            a         b         c         d         e
two -1.015127 -0.445133  1.867681  2.179392  0.518801

1
df.drop (df.index [0])도 작동합니다. 내 말은, 이중 square_brackets가 필요하지 않습니다 (최소한 팬더는 0.18.1 이상)
tagoma

23

나는 이것을 2 단계로 간단한 방법으로 해결했습니다.

1 단계 : 먼저 원치 않는 행 / 데이터가있는 데이터 프레임을 형성하십시오.

2 단계 : 원치 않는 데이터 프레임의 인덱스를 사용하여 원본 데이터 프레임에서 행을 삭제합니다.

예:

정수인 'Age'를 포함하여 많은 열에 데이터 프레임 df가 있다고 가정하십시오. 이제 'Age'를 음수로 사용하여 모든 행을 삭제한다고 가정 해 봅시다.

1 단계 : df_age_negative = df [df [ 'Age'] <0]

2 단계 : df = df.drop (df_age_negative.index, axis = 0)

이것이 훨씬 간단하고 도움이되기를 바랍니다.


1
+1, 이것은 첫 번째와 다른 열을 선택하여 행을 제거하는 방법을 알려주는 유일한 대답입니다.
Alejo Bernardin

10

index라고 말한 행을 삭제 x하려면 다음을 수행하십시오.

df = df[df.index != x]

여러 인덱스를 삭제하려면 (이러한 인덱스가 목록에 있음 unwanted_indices) 다음을 수행하십시오.

desired_indices = [i for i in len(df.index) if i not in unwanted_indices]
desired_df = df.iloc[desired_indices]

6

여기에 약간의 구체적인 예가 있습니다. 일부 행에 중복 항목이 많이 있다고 가정하십시오. 문자열 항목이 있으면 쉽게 문자열 메서드를 사용하여 삭제할 모든 인덱스를 찾을 수 있습니다.

ind_drop = df[df['column_of_strings'].apply(lambda x: x.startswith('Keyword'))].index

이제 색인을 사용하여 해당 행을 삭제합니다.

new_df = df.drop(ind_drop)

3

@ theodros-zelleke의 답변에 대한 의견에서 @ j-jones는 인덱스가 고유하지 않은 경우 수행 할 작업에 대해 물었습니다. 나는 그런 상황을 처리해야했습니다. 내가 한 것은 전화하기 전에 색인에서 중복 항목의 이름을 바꾸는 것입니다 drop().

dropped_indexes = <determine-indexes-to-drop>
df.index = rename_duplicates(df.index)
df.drop(df.index[dropped_indexes], inplace=True)

rename_duplicates()인덱스의 요소를 거쳐 중복의 이름을 변경 한 함수는 어디에 있습니까 ? 나는이 같은 이름을 바꾸는 패턴을 사용 pd.read_csv(), 즉 열에 사용, "%s.%d" % (name, count)여기서 name행의 이름이며 count이전에 발생한 횟수입니다.


1

위에서 설명한대로 부울에서 인덱스 결정

df[df['column'].isin(values)].index

이 방법을 사용하여 색인을 결정하는 것보다 메모리를 많이 사용합니다

pd.Index(np.where(df['column'].isin(values))[0])

이렇게 적용

df.drop(pd.Index(np.where(df['column'].isin(values))[0]), inplace = True)

이 방법은 큰 데이터 프레임과 제한된 메모리를 처리 할 때 유용합니다.


0

행을 삭제하려면 인덱스 인수 만 사용하십시오.

df.drop(index = 2, inplace = True)

여러 행의 경우 :-

df.drop(index=[1,3], inplace = True)

0

예제 데이터 프레임을 고려하십시오

df =     
index    column1
0           00
1           10
2           20
3           30

우리는 두 번째와 세 번째 색인 행을 삭제하려고합니다.

접근법 1 :

df = df.drop(df.index[2,3])
 or 
df.drop(df.index[2,3],inplace=True)
print(df)

df =     
index    column1
0           00
3           30

 #This approach removes the rows as we wanted but the index remains unordered

접근법 2

df.drop(df.index[2,3],inplace=True,ignore_index=True)
print(df)
df =     
index    column1
0           00
1           30
#This approach removes the rows as we wanted and resets the index. 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.