2017-11-21 5 views
1

아닌 다른 행이 있지만, p2 때로는 NaN 경우 Dataframe에서 행을 삭제하는 방법 :열의가 NaN과 열이 나는 행이 <code>p1</code> & <code>p2</code>로 식별됩니다 파이썬에서 팬더 dataframe가 NaN의

p1 p2 
0 a 1 
1 a 2 
2 a 3 
3 b NaN 
4 c 4 
5 d NaN 
6 d 5 

위 dataframe이 대부분 작동

df.drop_duplicates(subset=["p1","p2"], keep='last') 

를 사용하여 많은 중복 하나의 큰에서 반환 된, 유일한 문제는 있다는 것 NaN5은 기술적으로 중복되지 않으므로 삭제되지 않습니다. 동일한 p1not.null 등의 p2 값이 다른 행이 :

어떻게 ("d", NaN 등) 행을 삭제할 수있다. "d", 5. 여기서 중요한 것은 "b", NaN이 아니고 행이고 ​​"b", not.null 인 경우 보관되기 때문입니다.

답변

1

우리의 중복 세트는 본질적으로 사람들과 UNION을 NaN 값과 중복 p1 요소가 포함 된 행을 포함하는 모든 행의 교차점,해야 drop_duplicates

df.assign(p2=df.groupby('p1')['p2'].apply(lambda x : x.ffill().bfill())).\ 
     drop_duplicates(subset=["p1","p2"], keep='last') 
Out[645]: 
    p1 p2 
0 a 1.0 
1 a 2.0 
2 a 3.0 
3 b NaN 
4 c 4.0 
6 d 5.0 
1

다음 groupbyffillbfill, 할 수있는 두 열 모두에서 중복됩니다.

dupe_1 = df['p1'].duplicated(keep=False) & df['p2'].isnull() 
dupe_2 = df.duplicated(subset=['p1','p2']) 
total_dupes = dupe_1 | dupe_2 
new_df = df[~total_dupes] 

다음과 같은 데이터 프레임에서는 실패합니다.

p1 p2 
0 a NaN 
1 a NaN 

이러한 요소는 모두 제거됩니다. 따라서 먼저 df.drop_duplicates(subset=['p1','p2'], inplace=True, keep='last')을 실행하고 그 행 중 하나를 제외한 모든 행을 제거해야 솔루션이 다시 제대로 작동합니다.

+0

df.drop_duplicates (부분 집합 = [ "p1", "p2"], 유지 = '마지막')'이후에 응답 할 때까지 모든 사례를 제거해야합니다. –

+0

아, 훌륭한 점은 그 문제를 확실히 해결할 것입니다. 나는 그것을 포함시키기 위해 나의 대답을 편집 할 것이다. – Sebastian