ValueError:无法插入ID,已存在

Din*_*ius 13 python pandas

我有这些数据:

ID   TIME
1    2
1    4
1    2
2    3
Run Code Online (Sandbox Code Playgroud)

我想将数据分组ID并计算每组的平均时间和大小.

ID   MEAN_TIME COUNT
1    2.67      3
2    3.00      1
Run Code Online (Sandbox Code Playgroud)

如果我运行此代码,则会收到错误"ValueError:无法插入ID,已存在":

result = df.groupby(['ID']).agg({'TIME': 'mean', 'ID': 'count'}).reset_index()
Run Code Online (Sandbox Code Playgroud)

jez*_*ael 26

使用drop=True不创建新列的参数index但将其删除:

result = df.groupby(['ID']).agg({'TIME': 'mean', 'ID': 'count'}).reset_index(drop=True)
print (result)
   ID      TIME
0   3  2.666667
1   1  3.000000
Run Code Online (Sandbox Code Playgroud)

但是如果需要索引中的新列rename首先需要旧列名:

result = df.groupby(['ID']).agg({'TIME': 'mean', 'ID': 'count'})
           .rename(columns={'ID':'COUNT','TIME':'MEAN_TIME'})
           .reset_index()
print (result)
   ID  COUNT  MEAN_TIME
0   1      3   2.666667
1   2      1   3.000000
Run Code Online (Sandbox Code Playgroud)

解决方案如果需要通过多列进行聚合:

result = df.groupby(['ID']).agg({'TIME':{'MEAN_TIME': 'mean'}, 'ID': {'COUNT': 'count'}})
result.columns = result.columns.droplevel(0)
print (result.reset_index())
   ID  COUNT  MEAN_TIME
0   1      3   2.666667
1   2      1   3.000000
Run Code Online (Sandbox Code Playgroud)


piR*_*red 5

我将仅限groupby于该TIME专栏。

df.groupby(['ID']).TIME.agg({'MEAN_TIME': 'mean', 'COUNT': 'count'}).reset_index()

   ID  MEAN_TIME  COUNT
0   1   2.666667      3
1   2   3.000000      1
Run Code Online (Sandbox Code Playgroud)

  • @恐龙 是的!您需要在传递给“agg”的字典中传递详细信息,以说明应用于哪些列的函数以及如何命名结果列。最好要求一个具体的结果,我们可以帮助产生该结果。 (2认同)