programing

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

newsource 2023. 1. 30. 22:00

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

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

Data Frame이 크고 드롭할 행의 수가 많은 경우 인덱스별로 드롭합니다.df.drop(df.index[])시간이 너무 많이 걸린다.

제 경우 멀티인덱스화 Data Frame을 사용하여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.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가 있다고 가정합니다.이제 '나이'가 음수로 지정된 행을 모두 삭제한다고 가정해 보겠습니다.

df_age_negative = df[ df['Age'] < 0 ] # Step 1
df = df.drop(df_age_negative.index, axis=0) # Step 2

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

예를 들어 인덱스가 있는 행을 드롭하려면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)

행을 드롭하려면 Index arg만 사용합니다.-

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

여러 행의 경우:-

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

@theodros-zelleke의 답변에 대한 코멘트에서 @jjones는 인덱스가 고유하지 않을 경우 어떻게 해야 하는지 물었다.나는 그런 상황에 대처해야 했다.내가 한 일은 내가 전화하기 전에 인덱스에 있는 중복된 이름을 바꾼 것이다.drop(), a la:

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)서, snowledge.name의 이름과 "" 입니다.count이전에 발생한 횟수입니다.

위에서 설명한 대로 부울에서 인덱스를 결정합니다.

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)

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

인덱스가 1, 2, 4인 행을 드롭하려면 다음을 사용합니다.

df[~df.index.isin([1, 2, 4])]

연산자 " " "~ isin 은 인덱스를 하는 것입니다. 다른 옵션은 인덱스를 드롭하는 것입니다.

df.loc[df.index.drop([1, 2, 4])]

다음 데이터 프레임 df를 보세요.

df

   column1  column2  column3
0        1       11       21
1        2       12       22
2        3       13       23
3        4       14       24
4        5       15       25
5        6       16       26
6        7       17       27
7        8       18       28
8        9       19       29
9       10       20       30

열 1에 홀수가 있는 행을 모두 삭제합니다.

column1의 모든 요소의 목록을 작성하고 짝수인 요소(폐기하지 않는 요소)만 유지합니다.

keep_elements = [x for x in df.column1 if x%2==0]

이 「」인 행[2, 4, 6, 8, 10]1번으로 하다.

df.set_index('column1',inplace = True)
df.drop(df.index.difference(keep_elements),axis=0,inplace=True)
df.reset_index(inplace=True)

않은 은 모두 합니다.column1은 필요하지 않습니다.그런 다음 인덱스를 재설정합니다. df

   column1  column2  column3
0        2       12       22
1        4       14       24
2        6       16       26
3        8       18       28
4       10       20       30

Dennis Golomazov의 답변에서 알 수 있듯이,drop행을 드롭합니다.대신 행을 유지하도록 선택할 수 있습니다. 행 해 보겠습니다.indices_to_drop다음과 같이 마스크로 변환할 수 있습니다.

mask = np.ones(len(df), bool)
mask[indices_to_drop] = False

이 인덱스를 직접 사용할 수 있습니다.

df_new = df.iloc[mask]

은 '이것'이 있다는 입니다.mask모든 소스로부터 얻을 수 있습니다.많은 열이 관련된 상태일 수도 있고 다른 상태일 수도 있습니다.

정말 좋은 점은 원래 Data Frame의 인덱스가 전혀 필요하지 않기 때문에 인덱스가 고유하든 그렇지 않든 상관없습니다.

단점은 물론 이 방법으로는 드롭 인 플레이스를 할 수 없다는 것입니다.

데이터 프레임의 예를 검토하다

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. 

언급URL : https://stackoverflow.com/questions/14661701/how-to-drop-a-list-of-rows-from-pandas-dataframe