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