首页 > 解决方案 > pandas groupby.agg 列出行为

问题描述

有人可以帮助我了解这里发生了什么。

df = pd.DataFrame(columns=["ID", "alive", "Data"], 
                  data=[
                      [154887124, True, "Data1"],
                      [154887124, True, "Data2"],
                      [159320850, True, "Data3"],
                      [159320850, True, "Data4"],
                      [159320849, True, "Data5"]                      
                  ])
df = df.groupby(['ID','alive']).agg({'Data': lambda x: x.tolist()})
df

哪个输出:

                              Data
       ID   alive   
----------------------------------
154887124   True    [Data1, Data2]
159320849   True    [Data5]
159320850   True    [Data3, Data4]

我的目标是按 ID 和活动列分组,然后将数据列连接到一个列表中。上面的代码可以正常工作,但是由于某种原因,它会将“数据”列标题“向上”移动到其他 2 个列名称上方的一行。

从严格的外观角度来看,这很好,我可以毫无问题地引用数据列中的值,问题是我有一个完全相同格式的第二个数据框,只有“数据”列中的数据已经在列表中,我需要将它连接到它。但是,concat 语句与 2 个数据帧中的“数据”列不匹配,我能看到的唯一区别是第二个数据帧 ID、活动和数据都在标题中的同一“行”上。

为什么我的 groupby.agg 函数函数点他的数据帧?


更新

好的,这似乎是出于某种原因创建了一个 multiIndex,这似乎可以纠正它:

pd.DataFrame(df.to_records())

但是,我仍然很好奇为什么 groupby.agg 会创建这样的多索引?

标签: pythonpandasdataframepandas-groupby

解决方案


预计在默认情况下创建 groupbyindexMultiIndex从内部的列创建后groupby,为防止可能使用as_index=False参数或.reset_index()

df1 = df.groupby(['ID','alive'], as_index=False).agg({'Data': lambda x: x.tolist()})
#alternative
df1 = df.groupby(['ID','alive']).agg({'Data': lambda x: x.tolist()}).reset_index()

或者可以简化您的解决方案:

df1 = df.groupby(['ID','alive'], as_index=False)['Data'].agg(list)
#alternative
df1 = df.groupby(['ID','alive'], as_index=False)['Data'].agg(list)

print (df1)
          ID  alive            Data
0  154887124   True  [Data1, Data2]
1  159320849   True         [Data5]
2  159320850   True  [Data3, Data4]

推荐阅读