【问题标题】:How to combine ';'.join and lambda x: x.tolist() inside an groupby.agg() function?如何在 groupby.agg() 函数中结合 ';'.join 和 lambda x: x.tolist()?
【发布时间】:2020-01-30 10:32:12
【问题描述】:

在下方更新!

我正在尝试合并和排序 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())

产生类型错误:join() 只接受一个参数(给定 2 个)

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

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

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

【问题讨论】:

    标签: python pandas dataframe group-by aggregate


    【解决方案1】:

    您可以通过聚合函数将具有新列名的函数元组传递给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]
    

    【讨论】:

      【解决方案2】:

      首先您需要确保Address_IDstring

      那么你就可以应用这个函数了:

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

      更多关于'str'.joinmethod

      【讨论】:

        【解决方案3】:
        • 主要问题
          • 不能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
        

        【讨论】:

          猜你喜欢
          • 2021-02-22
          • 1970-01-01
          • 2021-09-06
          • 1970-01-01
          • 2020-02-08
          • 2021-03-15
          • 1970-01-01
          • 2015-05-06
          • 1970-01-01
          相关资源
          最近更新 更多