You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Pandas:连续相同r值行均值计算报错及解决

问题:计算连续相同r值行的均值

需求说明

我有一个包含x、y、r、g、b五列的数据集df3,仅需处理x、y、r三列。需要找出所有r值连续相同的行的均值,将结果存入df_final。

原始错误代码

d = {'x':[1,2,3,4,5,6,7],'y':[1,1,1,1,1,1,1],'r':[2,2,2,1,1,3,2]}
df3 = pd.Dataframe(data=d)
for i in range(len(df3)):
  if df3.iloc[i,3] == df3.iloc[i-1,3]:
    df_inter = pd.DataFrame(columns=['x','y', 'r'])
    df_inter.append(df3.iloc[i,1],df3.iloc[i,2],df3.iloc[i,3])
    df_inter.to_csv(f'Resultados/df_inter.csv', index=False, sep=',')
  else:
    df_final.append(df_inter['x'].mean(),df_inter['y'].mean(),df_inter['r'].mean())
    del [[df_inter]]
    gc.collect()
    df_inter=pd.DataFrame()
    df_inter = pd.DataFrame(columns=['x','y', 'r'])
    df_inter.append(df3.iloc[i,1],df3.iloc[i,2],df3.iloc[i,3])
    df_final.to_csv(f'Resultados/df_final.csv', index=False, sep=',')

示例输入数据集

xyr
112
212
312
411
511
613
712

期望输出结果

xyr
212
4.511
613
712

错误信息

TypeError: cannot concatenate object of type '<class 'numpy.int64'>'; only Series and DataFrame objs are valid

问题修正与正确代码

原始代码的核心问题:

  • df_inter.append()传入了单个数值(numpy.int64类型),但该方法仅接受Series或DataFrame对象;
  • 列索引错误(比如df3.iloc[i,3]对应g列,而非目标r列);
  • 未初始化df_inter和df_final,首次循环会报错;
  • 循环结束后未处理最后一组连续相同r值的行;
  • 拼写错误:pd.Dataframe应为pd.DataFrame(大写F)。

修正后的正确代码:

d = {'x':[1,2,3,4,5,6,7],'y':[1,1,1,1,1,1,1],'r':[2,2,2,1,1,3,2]}
df3 = pd.DataFrame(data=d)
df_inter = pd.DataFrame(columns=['x','y', 'r'])
df_final = pd.DataFrame(columns=['x','y','r'])

for i in df3.index.values:
    # 处理第一行的特殊情况
    if i == 0:
        df_inter = df_inter.append({'x':df3.iloc[i,0],'y':df3.iloc[i,1],'r':df3.iloc[i,2]}, ignore_index=True)
        continue
    if df3.iloc[i,2] == df3.iloc[i-1,2]:
        df_inter = df_inter.append({'x':df3.iloc[i,0],'y':df3.iloc[i,1],'r':df3.iloc[i,2]}, ignore_index=True)
    else:
        # 计算前一组均值并加入结果
        df_final = df_final.append({'x':df_inter['x'].mean(),'y':df_inter['y'].mean(),'r':df_inter['r'].mean()}, ignore_index=True)
        # 重置临时数据集并加入当前行
        df_inter = pd.DataFrame(columns=['x','y', 'r'])
        df_inter = df_inter.append({'x':df3.iloc[i,0],'y':df3.iloc[i,1],'r':df3.iloc[i,2]}, ignore_index=True)

# 处理最后一组连续行
df_final = df_final.append({'x':df_inter['x'].mean(),'y':df_inter['y'].mean(),'r':df_inter['r'].mean()}, ignore_index=True)
df_final.to_csv(f'Resultados/df_final.csv', index=False, sep=',')

更高效的实现方式

手动循环效率较低,推荐使用pandas内置的分组功能,按连续相同的r值分组,利用向量化操作提升效率:

import pandas as pd

d = {'x':[1,2,3,4,5,6,7],'y':[1,1,1,1,1,1,1],'r':[2,2,2,1,1,3,2]}
df3 = pd.DataFrame(data=d)

# 创建分组标识:当r值与前一行不同时,分组ID自增
group_id = (df3['r'] != df3['r'].shift()).cumsum()
# 按分组ID聚合计算均值
df_final = df3.groupby(group_id).agg({'x':'mean', 'y':'mean', 'r':'mean'}).reset_index(drop=True)

df_final.to_csv(f'Resultados/df_final.csv', index=False, sep=',')

内容的提问来源于stack exchange,提问作者ISanram

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 09:50:25