일부 조건이 충족 될 때 Dataframe에서 특정 행을 삭제하는 빠른 Pandas 접근 방식을 구성하려고합니다. 특히, 해당 행의 다른 값이 0 인 경우 데이터 프레임에서 일부 변수의 첫 번째 발생을 삭제하고 싶습니다. 이것은 아마도 예를 통해 가장 쉽게 설명 할 수 있습니다.
foo = np.array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3])
bar = np.array([1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1])
df = pd.DataFrame({'foo': foo, 'bar':bar})
# So df is:
idx | foo | bar
0 1 1
1 1 0
2 1 1
3 1 0
4 1 1
5 1 0
6 1 1
7 1 0
8 1 1
9 1 0
10 1 1
11 2 0
12 2 1
13 2 0
14 2 1
15 3 1
16 3 1
17 3 0
18 3 1
'foo'열이 새 값일 때 첫 번째 행을보고 해당 행의 'bar'값이 0이면 데이터 프레임에서 삭제하고 싶습니다.
groupby를 사용하여이 조건이 충족되는시기를 찾을 수 있습니다.
df.groupby('foo').first()
# Result:
bar
foo
1 1
2 0
3 1
따라서 foo = 2 일 때 첫 번째 행을 삭제해야한다는 것을 알았습니다 (즉, 원래 데이터 프레임에서 index = 11 인 행을 삭제하면됩니다). 그러나 모양 / 크기가 다르기 때문에이 groupby 결과를 원래 데이터 프레임의 마스크로 사용하는 방법을 알아낼 수 없습니다.
groupby 수정 ( groupby () 조건에 따라 팬더 데이터 프레임 행 삭제) 에 대한 관련 질문을 찾았 지만이 예에서는이 조건이 충족되면 모든 행을 삭제하는 반면 첫 번째 행만 삭제하고 싶습니다.
이것이 가능합니까?
사용 Series.shift
:
df.loc[~(df['foo'].ne(df['foo'].shift()) & df['bar'].eq(0))]
또는
df.loc[df.duplicated(subset = 'foo') | df['bar'].ne(0)]
분명히 훨씬 낫다
%%timeit
df.loc[~(df['foo'].ne(df['foo'].shift()) & df['bar'].eq(0))]
#970 µs ± 51.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) each)
%%timeit
df.loc[df.duplicated(subset = 'foo') | df['bar'].ne(0)]
#1.34 ms ± 34 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%%timeit
df.loc[~df.index.isin(df.drop_duplicates(subset='foo').loc[lambda x: x.bar==0].index)]
#2.16 ms ± 109 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
foo
귀하의 예와 같은 경우 :
%%timeit
df.loc[~(df['foo'].diff().ne(0)&df['bar'].eq(0))]
908 µs ± 15.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
또는
%%timeit
df.loc[df['foo'].duplicated().add(df['bar']).ne(0)]
787 µs ± 15.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다