2017-10-11 10 views
1

나는이처럼 보이는 테이블이 'original_table'GROUP BY Pandas/iPython 노트북 (Jupyter)의 DataFrame/table 행?</p> <p>현재 DataFrame/표 :

col_1   col_2    col_3 
0 Non-Saved  www.google.com 10 
1 Non-Saved  www.facebook.com 20 
2 Non-Saved  www.linkedin.com 20 
3 Saved   www.Quora.com  30 
4 Saved   www.gmail.com  40 

내가 그런 다음 사용하여 SQL 쿼리로 테이블을 도출 할 수 있습니까?

col_1   col_2    col_3 
0 Non-Saved  www.google.com 50 
        www.facebook.com 
        www.linkedin.com 
1 Saved   www.Quora.com  70 
        www.gmail.com  

는 기본적으로 나는, 컬럼 col_1에서 고유 한 값을 가지고 테이블을 기대하고 한 행에 col_3이에서 해당 값에 대한 col_2에는 및 SUM (col_3이) 모든 해당하는 값.

내 쿼리 :

sql("""SELECT col_1, group_concat(col_2) as col_2, SUM(col_3) as col_3 
FROM original_table 
GROUP BY col_1 
""").show() 

나는 group_concat를 사용하여 임베디드 SQL 쿼리를 사용하여 시도했지만 그것은 나에게 다음과 같은 오류 제공 :

AnalysisException: u"Undefined function: 'GROUP_CONCAT'. This function 
is neither a registered temporary function nor a permanent function 
registered in the database 'default'. 

사람이 아마 간단한 해킹 좀 도와 주실 수 있습니까? -

답변

1

사용 GroupBy.transform은 원래 그룹으로 같은 크기 Series를 반환 :

#first convert column to numeric 
df['col_3'] = df['col_3'].astype(int) #float 

df['col_3'] = df.groupby('col_1')['col_3'].transform('sum') 
print (df) 
     col_1    col_2 col_3 
0 Non-Saved www.google.com  50 
1 Non-Saved www.facebook.com  50 
2 Non-Saved www.linkedin.com  50 
3  Saved  www.Quora.com  70 
4  Saved  www.gmail.com  70 

그리고 만약 필요 단지 첫 번째 값 :

df[['col_1','col_3']] = df[['col_1','col_3']].mask(df['col_1'].duplicated()) 
print (df) 
     col_1    col_2 col_3 
0 Non-Saved www.google.com 50.0 
1  NaN www.facebook.com NaN 
2  NaN www.linkedin.com NaN 
3  Saved  www.Quora.com 70.0 
4  NaN  www.gmail.com NaN 

필요한 경우, NaN의 빈 문자열로 대체 할 수있다 -에 먼저 string 열에 아무런 문제가 없지만 마지막으로 혼합 된 유형을 얻습니다. 숫자가있는 문자열과 일부 기능이 실패해야합니다.

. '컬럼 col_1 \t col_2에는을 : 63,210
df[['col_1','col_3']] = df[['col_1','col_3']].mask(df['col_1'].duplicated()).fillna('') 
print (df) 
     col_1    col_2 col_3 
0 Non-Saved www.google.com 50 
1    www.facebook.com  
2    www.linkedin.com  
3  Saved  www.Quora.com 70 
4    www.gmail.com  

print (df['col_3'].apply(type)) 
0 <class 'float'> 
1  <class 'str'> 
2  <class 'str'> 
3 <class 'float'> 
4  <class 'str'> 
Name: col_3, dtype: object 
+0

'의 DF ['col_3이 '] = df.groupby ('컬럼 col_1 ')'col_3이 '는 ("합") 변환' 나 준 \t col_3이 \t 비 저장된 \t www.google.com \t 102,020 \t 비 저장된 \t www.facebook.com \t 102,020 \t 비 저장된 \t www.linkedin.com \t 102 020 \t 저장 \t www.Quora.com \t 저장 \t www.gmail.com 먼저 DF'같은 번호 [ 'col_3이'] = 안양 3 열을 변환 할 필요가 \t 3040' –

+0

[ 'col_3이']. astype (int)' – jezrael

+0

이제 작동합니다. 이 경우 2 행으로 결과를 얻을 수 있습니까? 감사합니다. –