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=',')
示例输入数据集
| x | y | r |
|---|---|---|
| 1 | 1 | 2 |
| 2 | 1 | 2 |
| 3 | 1 | 2 |
| 4 | 1 | 1 |
| 5 | 1 | 1 |
| 6 | 1 | 3 |
| 7 | 1 | 2 |
期望输出结果
| x | y | r |
|---|---|---|
| 2 | 1 | 2 |
| 4.5 | 1 | 1 |
| 6 | 1 | 3 |
| 7 | 1 | 2 |
错误信息
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
相关产品推荐
相关产品推荐

