熊猫groupby.agg列出行为

时间:2019-08-03 04:33:41

标签: python pandas dataframe pandas-groupby

有人可以帮助我了解这里发生的事情吗。

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个数据帧中的“ Data”列不匹配,并且我可以看到的唯一区别是第二个数据帧ID,alive和Data都在标头中的同一“行”上。

为什么我的groupby.agg函数函数将其点到数据帧?


更新

好吧,出于某种原因,这似乎正在创建multiIndex,并且似乎可以对其进行纠正:

pd.DataFrame(df.to_records())

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

1 个答案:

答案 0 :(得分:1)

为了防止使用index参数或{{1},可能会在默认情况下从MultiIndex的列中创建groupbyas_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)