2016-11-20 2 views
2

name 열과 department 열이있는 데이터 프레임이 있습니다. name 열에는 department 값이 다른 반복이 있지만 다른 모든 열 값은 동일합니다. 나는 의 한 행으로 반복하고 서로 다른 (고유 한) 부서 값을 목록에 결합합니다. 따라서 각 그룹의 첫 번째 행을 가져 와서 department 값을 해당 그룹의 고유 한 department 값 목록으로 변경하십시오. 따라서 결과 데이터 프레임은 정확히 동일한 열을 가져야하지만 name 열과 department 열에는 반복되지 않습니다. 이제 하나 이상의 요소 목록이 있습니다.사용자 정의 팬 그룹 groupby 집계 함수를 사용하여 데이터 프레임의 행을 결합하는 방법

나는 groupby을 사용하고 사용자 정의 집계 함수는 agg()으로 전달되었지만 다음은 완전히 실패합니다. 내 생각에 내 집계 함수는 각 그룹을 데이터 프레임으로 가져오고 각 데이터 프레임 그룹에 대해 계열을 반환하면 groupby.agg(flatten_departments)의 결과가 데이터 프레임이됩니다.

def flatten_departments(name_group): 
    #I thought name_group would be a df of that group 

    #this group is length 1 so this name doesn't actually repeat so just return same row 
    if len(name_group) == 1: 
     return name_group.squeeze() #turn length-1 df into a series to return, don't worry that department is a string and not a list for now 
    else: 
     #treat name_group like a df and get the unique departments 
     departments = list(name_group['department'].unique()) 
     name_ser = name_group.iloc[0,:] #take first "row" of this group 
     name_ser['department'] = departments #replace department value with list of unique values from group 

     return name_ser 

my_df = my_df.groupby(['name']).agg(flatten_departments) 

이것은 재해이고 name_group는 DF하지만 인덱스가 원래의 DF에서 인덱스가 연속되지 않고, 이름이 그 열의 최초 DF 가치 값에서 다른 컬럼의 이름 .

내가

list_of_ser = [] 
for name, gp in my_df.groupby(['name']): 
    if len(gp) == 1: 
     list_of_ser.append(gp.squeeze()) 
    else: 
     new_ser = gp.iloc[0,:] 
     new_ser['department'] = list(gp['department'].unique()) 
     list_of_ser.append(new_ser) 

new_df = pd.DataFrame(list_of_ser, columns=my_df.columns) 

을 다음과 같이 난 그냥 groupby 개체 위에 루프를 할 수 있다는 것을 알고 있지만 난 그냥 그 agg의 포인트라고 생각!

agg으로 목표를 달성하는 방법이나 for 루프가 실제로 올바른 방법인지 확인하십시오. for 루프가 올바른 방법이면 agg의 요점은 무엇입니까?

감사합니다. 다른 모든 열을 보존해야하는 경우

답변

1
df = pd.DataFrame(
    dict(
     name=list('ABCDEFGACEF'), 
     dept=list('xyxyzxyzyxz') 
    ) 
) 

df.groupby('name').dept.apply(list).reset_index() 

enter image description here


agg

df.groupby('name').dept.agg(dict(dept=lambda x: list(x))).reset_index() 

처럼 사용할 수 있었다

df = pd.DataFrame(
    dict(
     name=list('ABCDEFGACEF'), 
     dept=list('xyxyzxyzyxz') 
    ) 
) 

g = df.groupby('name') 
pd.concat([g.dept.apply(list), g.first().drop('dept', 1)], axis=1).reset_index() 
+0

답변을 주셔서 감사합니다. 단 한 줄 적용은 완전히 보스입니다. 또한 ""과 같이 사전 표기법을 사용하여 'agg'예제를 이해합니다. 내가 아직도 혼란스러워하는 부분은 매개 변수가 함수 인 곳에서'agg'를 어떻게 사용하는지입니다 -'agg'에서 그 함수의 "규칙"은 무엇입니까? 왜 다른 임의의 열에 대해 시리즈를 전달하는거야?! – ministry

+0

'.agg '전에'.dept'를 보라. 즉, 이미'agg'를 시리즈로 제한했습니다. 즉,'dict (dept = lambda)'는'lambda'를 사용하고'dept' 컬럼을 호출하도록 지정합니다. 'dict'에서'dept'를 변경하면 다른 열 이름이 생깁니다. 이 경우에는 'agg'를 사용하지 않을 것입니다. 나는 단지 당신에게 예를 보여주기를 원했기 때문에 무슨 일이 벌어 졌는지 더 잘 알 수있었습니다. – piRSquared

+0

'apply' 호출에서 나온 데이터 프레임은'name'과'department' 컬럼 만 가지고 있습니다 - 어떻게 나머지 컬럼을 다시 얻게할까요? – ministry

관련 문제