有人可以帮助我了解这里发生的事情吗。
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这样创建一个多索引?
答案 0 :(得分:1)
为了防止使用index
参数或{{1},可能会在默认情况下从MultiIndex
的列中创建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)