2016-11-22 4 views
1

나는 이름 열과 숫자 열을 포함하는 데이터 프레임을 가지고 있습니다.열 값을 공유하는 팬더 데이터 프레임의 행 그룹 비교

0 name number 
1 a 3 
2 a 6 
3 b 2 
4 b 500 
5 c 349 
6 c 200 

내가하고 싶은 일은 이름이 같은 두 개의 순차적 행 사이의 숫자 차이를 나타내는 새 열을 정의하는 것입니다. 이것은 비교의 첫 번째 행에 출력 할 수 있습니다.

0 name number diff 
1 a 3  3 
2 a 6  N/A 
3 b 2  498 
4 b 500 N/A 
5 c 349 149 
6 c 200 N/A 

팬더를 사용하여 이것을 수행하는 가장 좋은 방법은 무엇입니까? 보너스로 같은 이름의 행이 두 개 이상인 경우 가장 낮은 값의 행과 비교하여 가장 높은 번호의 행을 원합니다. diffabs

답변

1

사용 groupby :

df['diff'] = df.groupby('name')['number'].diff().abs() 
print (df) 
    0 name number diff 
0 1 a  3 NaN 
1 2 a  6 3.0 
2 3 b  2 NaN 
3 4 b  500 498.0 
4 5 c  349 NaN 
5 6 c  200 149.0 

또는 :

print (df) 
    0 name number 
0 1 a  3 
1 2 a  6 
2 2 a  8 
3 3 b  2 
4 4 b  500 
5 4 b  600 
6 5 c  349 
7 6 c  200 

df['diff'] = df.groupby('name')['number'].transform(lambda x: x.max() - x.min()) 
print (df) 
    0 name number diff 
0 1 a  3  5 
1 2 a  6  5 
2 2 a  8  5 
3 3 b  2 598 
4 4 b  500 598 
5 4 b  600 598 
6 5 c  349 149 
7 6 c  200 149 

또는 : : 또 다른 질문이 transform 필요 당신을 위해

df['diff'] = df.groupby('name')['number'].diff(-1).abs() 
print (df) 
    0 name number diff 
0 1 a  3 3.0 
1 2 a  6 NaN 
2 3 b  2 498.0 
3 4 b  500 NaN 
4 5 c  349 149.0 
5 6 c  200 NaN 

,536,
df = df.groupby('name')['number'].apply(lambda x: x.max() - x.min()).reset_index() 
print (df) 
    name number 
0 a  5 
1 b  598 
2 c  149 
+0

두 번째 대답을 이해할 수 있을지 모르겠습니까? – jezrael

+0

아니 내 질문을 올바르게 이해했습니다. 동일한 이름을 가진 두 개 이상의 순차 행의 경우, 가장 높은 숫자가 가장 낮은 숫자와 비교됩니다. 포괄적 인 답변 주셔서 감사합니다. – GreenGodot

+0

수퍼, 수락 해 주셔서 감사합니다! – jezrael

관련 문제