2017-10-29 11 views
1

나는 다음과 같은 구조의 dataframe 있습니다데이터 오류

mydf가 :

이에서 수행 할 일이 있습니다
Entry Address   ShortOrdDesc 
0 988  Fake Address 1 SC_M_W_3_1 
1 989  Fake Address 2 SC_M_W_3_3 
2 992  Fake Address 3 nan_2 
3 992      SC_M_G_1_1 
4 992      SC_M_O_1_1 

과 함께 행을 결합 DF를 같은 엔트리. 이러한 경우에만 첫 번째 행의 주소는 입니다. ShortOrdDesc 열과 주소을 연결해야합니다.

Pandas groupby: How to get a union of strings

이에서 근무 나는 다음과 같은 기능을 개발했다 :

def f(x): 
    return pd.Series(dict(A = x['Entry'].sum(), 
         B = x['Address'].sum(), 
         C = "%s" % '; '.join(x['ShortOrdDesc']))) 

이 오류를 반환

myobj = ordersToprint.groupby('Entry').apply(f) 

사용하여 적용됩니다 나는 이것에 매우 유용한 링크를 발견 :

TypeError: must be str, not int

내 데이터를 보면 .sum()을 'Entry'의 정수로 실행하면 문제가없는 것으로 보입니다.

내 코드 또는 내 접근 방식의 오류는 무엇입니까?

답변

1

일부 열은 숫자이며 string이 필요하다고 생각합니다.

그래서 astype를 사용하여 제거 NaN의 필요한 경우 dropna을 추가

def f(x): 
return pd.Series(dict(A = x['Entry'].sum(), 
        B = ''.join(x['Address'].dropna().astype(str)), 
        C = '; '.join(x['ShortOrdDesc'].astype(str)))) 

myobj = ordersToprint.groupby('Entry').apply(f) 
print (myobj) 
      A    B        C 
Entry              
988  988 Fake Address 1      SC_M_W_3_1 
989  989 Fake Address 2      SC_M_W_3_3 
992 2976 Fake Address 3 nan_2; SC_M_G_1_1; SC_M_O_1_1 

또 다른 해결책을 agg으로,하지만 필요에 이름 바꾸기 열 수 있습니다 :

f = {'Entry':'sum', 
     'Address' : lambda x: ''.join(x.dropna().astype(str)), 
     'ShortOrdDesc' : lambda x: '; '.join(x.astype(str))} 
cols = {'Entry':'A','Address':'B','ShortOrdDesc':'C'} 
myobj = ordersToprint.groupby('Entry').agg(f).rename(columns=cols)[['A','B','C']] 
print (myobj) 
      A    B        C 
Entry              
988  988 Fake Address 1      SC_M_W_3_1 
989  989 Fake Address 2      SC_M_W_3_3 
992 2976 Fake Address 3 nan_2; SC_M_G_1_1; SC_M_O_1_1