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단계로 간단하게 해결했다.
불필요한 행/데이터로 데이터 프레임을 만듭니다.
이 불필요한 데이터 프레임의 인덱스를 사용하여 원래 데이터 프레임에서 행을 삭제합니다.
예를 들어:
정수인 '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
'programing' 카테고리의 다른 글
Jinja2에서 날짜 형식을 어떻게 써요? (0) | 2023.01.30 |
---|---|
대용량 데이터 테이블에서 각 사용자의 첫 번째/마지막 행을 선택하는 SQL 퍼포먼스 (0) | 2023.01.30 |
Virtual Box Vagrant 내에서 Mysql 서버에 연결하는 방법 (0) | 2023.01.30 |
JBoss 6에서의 MariaDB XA 드라이버 설정 (0) | 2023.01.30 |
mysql 서비스가 시작되지 않거나 중단됨 - 시간 초과(Ubuntu, MariaDB) (0) | 2023.01.30 |