如何在groupby.agg()函数内合并';'。join和lambda x:x.tolist()?

时间:2019-10-01 07:02:26

标签: python pandas dataframe group-by aggregate

下面更新!

我正在尝试对ID列表及其连接的唯一Name_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]

有人可以告诉我最好的方法是摆脱列表格式并用分号代替逗号分隔吗?

更新

用户Jezrael为此thread链接了我。但是我似乎无法将';'.joinlambda x: x.tolist()结合使用。

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

产生TypeError:join()仅接受一个参数(给定2个参数)

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

产生TypeError:()接受1个位置参数,但给出了2个。

我也尝试了其他组合,但似乎都无法正常执行。摆脱lambda函数不是一种选择,因为它只会粘贴Name_ID Adress_ID一千次,而不是正确的Name和ID。

3 个答案:

答案 0 :(得分:2)

您可以将具有新列名称和聚合函数的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]

答案 1 :(得分:0)

首先,您需要确保Address_IDstring

然后您可以应用此功能:

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

有关'str'.join method

的更多信息

答案 2 :(得分:0)

  • 主要问题
    • 不能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