python - python - 如何在groupby.agg()函数中组合';'.join和lambda x: x.tolist()?

我正在尝试合并和排序一个ID列表及它连接的唯一名称,用分号分隔,例如:


Name_ID Adress_ID Name_ID Adress_ID


Name1 5875383 Name1 5875383; 5901847


Name1 5901847 Name2 5285200


Name2 5285200 to Name3 2342345; 6463736


Name3 2342345


Name3 6463736



这是我当前的代码:


origin_file_path = Path("Folder/table.xlsx")


dest_file_path = Path("Folder/table_sorted.xlsx")



table = pd.read_excel(origin_file_path)


df1 = pd.DataFrame(table)



df1 = df1.groupby('Name_ID').agg(lambda x: x.tolist())



df1.to_excel(dest_file_path, sheet_name="Adress_IDs")



但是它这样导出到excel文件:


Name_ID Adress_ID


Name1 [5875383, 5901847]



谁能告诉我更好的方式去除列表格式,并用分号代替逗号?


df1 = df1.groupby('Kartenname').agg(';'.join, lambda x: x.tolist())



Produces TypeError : join() takes exactly one argument (2 given )


df1 = df1.groupby('Kartenname').agg(lambda x: x.tolist(), ';'.join)



Produces TypeError : () takes 1 positional argument but 2 were given .

时间:

你可以使用有聚合函数的新列名称传递给agg函数元组:


df['Adress_ID'] = df['Adress_ID'].astype(str)


df1 = df.groupby('Name_ID')['Adress_ID'].agg([('a', ';'.join),


 ('b', lambda x: x.tolist())])



print (df1)


 a b


Name_ID 


Name1 5875383;5901847 [5875383, 5901847]


Name2 5285200 [5285200]


Name3 2342345;6463736 [2342345, 6463736]



如果只在列表(没有元组)中传递聚合函数,则获取默认列名称:


df2 = df.groupby('Name_ID')['Adress_ID'].agg([ ';'.join,lambda x: x.tolist()])



print (df2)


 join <lambda_0>


Name_ID 


Name1 5875383;5901847 [5875383, 5901847]


Name2 5285200 [5285200]


Name3 2342345;6463736 [2342345, 6463736]



首先你需要确保Address_IDstring

然后你可以应用此功能:


df.groupby('Name_ID').agg(lambda x: ':'.join(list(x.values)))



  • 主要问题
    • 无法joinint

Name_ID Adress_ID


 Name1 5875383


 Name1 5901847


 Name2 5285200


 Name3 2342345


 Name3 6463736



def fix_my_stuff(x):


 x = x.tolist()


 x = '; '.join([str(y) for y in x])


 return(x)



df_updated = df.groupby('Name_ID').agg(lambda x: fix_my_stuff(x)).reset_index()


print(df_updated)



Name_ID Adress_ID


 Name1 5875383; 5901847


 Name2 5285200


 Name3 2342345; 6463736



...