2017-12-12 5 views
1

포인트가 충분하지 않은 행의 그룹 라벨 값을 변경해야합니다. I는 C2 내의 값과 각 그룹 내의 포인트의 최소 개수에 그룹 인 경우, 예를 들어 ,팬더 - 그룹의 값 변경

+-----+ 
|c1|c2| 
+-----+ 
|A |1 | 
|A |2 | 
|B |1 | 
|A |2 | 
|E |5 | 
|E |6 | 
|W |1 | 
+-----+ 

는 명확

c2: 
1 : count(c1) = 3 
2 : count(c1) = 2 
5 : count(c1) = 1 
6 : count(c1) = 1 

2보다 크거나 같은 그룹을 갖는 5와 6은 각 요소가 하나뿐이므로 그 행의 c2 값을 -1로 다시 지정하고 싶습니다.

아래에서 확인할 수 있습니다.

+-----+ 
|c1|c2| 
+-----+ 
|A |1 | 
|A |2 | 
|B |1 | 
|A |2 | 
|E |-1| 
|E |-1| 
|W |1 | 
+-----+ 

이것은 내가 작성한 코드이지만 데이터 프레임을 업데이트하지는 않습니다.

labels = df["c2"].unique() 
for l in labels: 
    group_size = df[DB["c2"]==l].shape[0] 
    if group_size<=minPts: 
     df[df["c2"]==l]["c2"] = -1 
+1

좋은 작은 DataFrame! 여기에 하나의 작은 요청이 있습니다. 사람들을 위해서도 복사 - 붙여 넣기가 가능하면 repl에 직접 데이터 프레임을 복사하고 문제를 해결할 수 있다면 더욱 좋습니다. [여기] (https://stackoverflow.com/questions/20109391/how-to-make-good-reproducible-pandas-examples)를 보시면 도움이 될 것입니다! 감사 ! – stucash

답변

1

그런 다음 isinmask에 의해 값을 필터링하고 마지막 세트 value_counts를 사용할 수 있습니다

s = df['c2'].value_counts() 
s = s.index[s < 2] 
print (s) 
Int64Index([6, 5], dtype='int64') 

df.loc[df['c2'].isin(s), 'c2'] = -1 
print (df) 
    c1 c2 
0 A 1 
1 A 2 
2 B 1 
3 A 2 
4 E -1 
5 E -1 
6 W 1 

세부 사항 : 거기

print (df['c2'].value_counts()) 
1 3 
2 2 
6 1 
5 1 
Name: c2, dtype: int64 

print (df['c2'].isin(s)) 
0 False 
1 False 
2 False 
3 False 
4  True 
5  True 
6 False 
Name: c2, dtype: bool