如何在Python中计算DataFrame每50行指定列的众数?
解决Python计算DataFrame每50行众数的报错问题
首先看你遇到的报错:'int' object does not support item assignment,这大概率是因为你初始化mode_pressure的时候把它设成了整数(比如mode_pressure = 0),而不是一个可以动态添加元素的列表或者Pandas Series,所以当你尝试mode_pressure[j] = ...的时候就会报错。
另外你的循环逻辑也有问题:Python的for i in range(...)会自动迭代range里的数值,你在循环里写i = i+50完全不会改变循环的迭代节奏,这会导致你重复处理很多行。
先修复你的循环代码(不推荐用于80万行数据)
如果一定要用循环,先把mode_pressure初始化为空列表,然后正确控制分组的起始索引:
import pandas as pd # 假设你的原始数据是data这个DataFrame mode_pressure = [] n = len(data['Column5']) # 从0开始,每次跳50行,取50行的区间 for i in range(0, n, 50): # 处理最后一组可能不足50行的情况 splitdata = data['Column5'][i:i+50] # 和R的mfv一致,取最后一个众数(如果有多个众数) mode_val = splitdata.mode().iloc[-1] if not splitdata.mode().empty else None mode_pressure.append(mode_val) # 转成目标DataFrame df_mode = pd.DataFrame(mode_pressure, columns=['Column5_mode'])
更高效的Pandas分组方法(推荐用于大数据集)
80万行的话,手动循环效率很低,用Pandas的groupby配合分组键会快很多,逻辑也更清晰:
import pandas as pd import numpy as np # 创建分组键:每50行一组,组号从0开始 data['group_id'] = np.arange(len(data)) // 50 # 按组计算众数,和R的mfv一致取最后一个众数 df_mode = data.groupby('group_id')['Column5'].agg( lambda x: x.mode().iloc[-1] if not x.mode().empty else None ).reset_index(drop=True).to_frame(name='Column5_mode')
为什么你的R代码能运行?
R里如果初始化mode_value为一个空变量,赋值的时候会自动扩展成向量,而Python不会自动做这个,必须提前初始化一个可变的容器(比如列表)才能动态添加元素。另外你的R循环里用while手动控制i的增长,逻辑是对的,但Python的for循环和R的while逻辑不同,所以直接转写会出问题。
内容的提问来源于stack exchange,提问作者veggie crunch burger
相关产品推荐
相关产品推荐

