Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python ValueError:无法插入ID,已存在_Python_Pandas - Fatal编程技术网

Python ValueError:无法插入ID,已存在

Python ValueError:无法插入ID,已存在,python,pandas,Python,Pandas,我有以下数据: ID TIME 1 2 1 4 1 2 2 3 我想根据ID对数据进行分组,并计算每组的平均时间和大小 ID MEAN_TIME COUNT 1 2.67 3 2 3.00 1 如果运行此代码,则会出现错误“ValueError:无法插入ID,已存在”: 使用参数drop=True,该参数不使用索引创建新列,而是将其删除: result = df.groupby(['ID']).agg({'TIME': 'mea

我有以下数据:

ID   TIME
1    2
1    4
1    2
2    3
我想根据
ID
对数据进行分组,并计算每组的平均时间和大小

ID   MEAN_TIME COUNT
1    2.67      3
2    3.00      1
如果运行此代码,则会出现错误“ValueError:无法插入ID,已存在”:


使用参数
drop=True
,该参数不使用
索引创建新列,而是将其删除:

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
但如果需要索引中的新列,则需要先重命名旧列名:

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
如果需要多列聚合,解决方案:

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

我将我的
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

你能解释一下
drop=True
的作用吗?@Diologius没有尝试将现有索引合并回数据帧,而是直接将其删除。因此,
new
将包含
ID
,而
ID
将被计数,对吗?(在第二种解决方案中)如果只需要组的大小,而不需要计算
ID
列中的
NaN
值,我认为这种方法更好。请参见@jezrael:是的,我在
ID
列中没有NaN值。只是好奇:这个解决方案只允许按
时间进行平均?如果我有更多的列需要平均,那么这将需要改变,对吗?@Digoraius是的!您需要将字典中的详细信息传递给
agg
,以说明应用于哪些列的函数以及如何命名结果列。最好要求一个具体的结果,我们可以帮助产生这个结果。现在发生在我身上,下面的答案不起作用。但奇怪的是,将我的熊猫从
1.0.5
升级到
1.1.1
成功了!要升级,只需执行
pip-upgrade==1.1.1
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