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
의 요점은 무엇입니까?
감사합니다. 다른 모든 열을 보존해야하는 경우
답변을 주셔서 감사합니다. 단 한 줄 적용은 완전히 보스입니다. 또한 " 열 "과 같이 사전 표기법을 사용하여 'agg'예제를 이해합니다. 내가 아직도 혼란스러워하는 부분은 매개 변수가 함수 인 곳에서'agg'를 어떻게 사용하는지입니다 -'agg'에서 그 함수의 "규칙"은 무엇입니까? 왜 다른 임의의 열에 대해 시리즈를 전달하는거야?! –
ministry
'.agg '전에'.dept'를 보라. 즉, 이미'agg'를 시리즈로 제한했습니다. 즉,'dict (dept = lambda)'는'lambda'를 사용하고'dept' 컬럼을 호출하도록 지정합니다. 'dict'에서'dept'를 변경하면 다른 열 이름이 생깁니다. 이 경우에는 'agg'를 사용하지 않을 것입니다. 나는 단지 당신에게 예를 보여주기를 원했기 때문에 무슨 일이 벌어 졌는지 더 잘 알 수있었습니다. – piRSquared
'apply' 호출에서 나온 데이터 프레임은'name'과'department' 컬럼 만 가지고 있습니다 - 어떻게 나머지 컬럼을 다시 얻게할까요? – ministry