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.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
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은 동일합니다.
나는 이것을 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)
@ 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
이전에 몇 번이나 발생했는지입니다.
위에서 설명한대로 부울에서 인덱스 결정
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)
이 방법은 큰 데이터 프레임과 제한된 메모리를 처리 할 때 유용합니다.
참고 URL : https://stackoverflow.com/questions/14661701/how-to-drop-a-list-of-rows-from-pandas-dataframe
'Programing' 카테고리의 다른 글
올바른 "this"컨텍스트를 setTimeout 콜백에 전달 하시겠습니까? (0) | 2020.04.20 |
---|---|
파이썬에서 현재 OS를 어떻게 찾을 수 있습니까? (0) | 2020.04.20 |
디렉토리에서 모든 PHP 파일을 포함시키는 방법은 무엇입니까? (0) | 2020.04.20 |
Swift의 첫 번째 ViewController에서 탐색 막대를 숨기는 방법은 무엇입니까? (0) | 2020.04.20 |
동일한 유형을 포함하는 두 개의 HashMap 객체를 결합하려면 어떻게해야합니까? (0) | 2020.04.20 |