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

데이터 프레임 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

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



답변

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


답변

드롭 인 라인을 수행하려는 경우 “inplace”명령을 사용하는 것이 중요 할 수 있습니다.

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

원래 질문에 아무것도 반환되지 않으므로이 명령을 사용해야합니다.
http://pandas.pydata.org/pandas-docs/version/0.17.0/generated/pandas.DataFrame.drop.html


답변

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은 동일합니다.


답변

당신은 또한에 전달할 수있는 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


답변

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

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

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

예:

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

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

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

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


답변

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]


답변

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

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

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

new_df = df.drop(ind_drop)