2017-12-12 19 views
1

간단한 문제로 약간 어려움을 겪고 있습니다. 희망을위한 간단한 해결책도 있습니다. 내 데이터 프레임은 다음과 같습니다.팬더 데이터 프레임은 키 기반의 행을 줄이거 나 늘립니다.

DataFrame: 
8 buy 4 
7 sell 1 
6 buy 1 
5 sell 3 
4 sell 10 
3 buy 100 
2 buy 110 
1 buy 120 

서로 다른 주문을 추가하는 방법이 있습니까? 그래서 df 변환 :

DataFrame: 
8 buy 4 
7 sell 1 
6 buy 1 
4 sell 3 + 10 
1 buy 100 + 110 + 120 

내 문제는 좀 더 복잡합니다. 나는 iterrows로 해결할 수 있다고 생각하지만 더 간단한 해결책이 있기를 바랬다.

+0

개별 항목을 병합 및 유지에 대한 정확한 기준이 무엇입니까? 예를 들어 어떻게 유지하겠습니까? 첫 번째 두 행을 구입하지만 마지막 세 병합? – albert

답변

3

groupby

df.groupby((df.b!=df.b.shift()).ne(0).cumsum()).agg({'a':'last','c':lambda x : '+'.join(x.astype(str)),'b':'first'}) 
Out[1227]: 
    a   c  b 
b      
1 8   4 buy 
2 7   1 sell 
3 6   1 buy 
4 4   3+10 sell 
5 1 100+110+120 buy 

데이터 입력을 agg 사용 :

df 
Out[1228]: 
    a  b c 
0 8 buy 4 
1 7 sell 1 
2 6 buy 1 
3 5 sell 3 
4 4 sell 10 
5 3 buy 100 
6 2 buy 110 
7 1 buy 120 

상세 정보 :

(df.b!=df.b.shift()).ne(0).cumsum() 
Out[1229]: 
0 1 
1 2 
2 3 
3 4 
4 4 
5 5 
6 5 
7 5 
Name: b, dtype: int32 
+0

그런 식으로 작동한다는 것이 놀랍습니다! 고마워요! 그것은 cumsum와 좋은 트릭이야! – MichaelRazum

+0

@MichaelRazum yw ~ : -) 해피 코딩 – Wen

0

그것은 문자열이 아닌 실제 금액을 찾고 수 있습니다 당신처럼 보인다 추가 표현. 다음이 말 :

id_ order px 
0 8 buy 4 
1 7 sell 1 
2 6 buy 1 
3 5 sell 3 
4 4 sell 10 
5 3 buy 100 
6 2 buy 110 
7 1 buy 120 

그런 경우가 있다면, 여기 당신은 사용할 수 있습니다

df['order_bin'] = np.where(df.order=='buy', 1, 0) 
df['group'] = (df.order_bin.diff().fillna(0.) != 0.).cumsum() 
df.groupby('group')['px'].sum() 

0  4 
1  1 
2  1 
3  13 
4 330