一次循环下分箱可以运行,但两次循环下分箱就会报错
ValueError: Bin edges must be unique: array([1., 1., 1., 1.]).
You can drop duplicate edges by setting the 'duplicates' kwarg
data = pd.read_csv('3.1.处理后数据.csv')
indcd = data['Indcd'].value_counts().index
year = data['Accper'].value_counts().index
data_remo = pd.DataFrame(columns=data.columns) # 新建一个df用于储存
for i in indcd:
data_group = data[data['Indcd'].isin([i])].copy() # 按行业分组
for j in year:
d = data_group[data_group['Accper'].isin([j])].copy()
d['S_resource'], cut_bin = pd.qcut(d['p_opr_ass'].rank(method='first'), q=3, labels=['投资型战略', '经营投资型并重型战略', '经营型战略'], retbins=True)
data_remo = data_remo.append(d)
ValueError: Bin edges must be unique: array([1., 1., 1., 1.]).
You can drop duplicate edges by setting the 'duplicates' kwarg
data = pd.read_csv('3.1.处理后数据.csv')
indcd = data['Indcd'].value_counts().index
data_remo = pd.DataFrame(columns=data.columns) # 新建一个df用于储存
for i in indcd:
data_group = data[data['Indcd'].isin([i])].copy() # 按行业分组
data_group['S_resource'], cut_bin = pd.qcut(data_group['p_opr_ass'].rank(method='first'), q=3, labels=['投资型战略', '经营投资型并重型战略', '经营型战略'], retbins=True)
data_remo = data_remo.append(data_group, ignore_index=True)
这是一次循环下的代码,加了.rank(method='first')可以正确运行,但是到了第二次循环就不知道为什么不行了
望采纳!点击该回答右侧的“采纳”按钮即可采纳!!
我调试了一下你的代码发现这个错误是是因为你在分箱的时候出现了重复的边界值,导致无法分箱。
可以尝试调整分箱方法或者调整分箱数量来避免这个问题。
例如,你可以使用 'bins' 参数手动指定分箱边界值,避免出现重复的边界值。
d['S_resource'], cut_bin = pd.cut(d['p_opr_ass'], bins=[0, 50, 100, 150, 200], labels=['投资型战略', '经营投资型并重型战略', '经营型战略'], retbins=True)
你的代码中,你使用了 pd.qcut() 函数来将 p_opr_ass 列的值分成三份,并使用了 rank(method='first') 函数来对分箱进行排序。但是,由于 rank(method='first') 函数对每个唯一值都会分配一个等级,因此在分组后的数据中可能会出现重复的等级。这会导致 pd.qcut() 函数产生重复的分箱边界,从而导致上述错误。
为了解决这个问题,你可以按照下面的步骤修改代码:
在第一次循环中,对所有行业的数据进行分组,并对每组数据的 p_opr_ass 列进行排序。
在第二次循环中,对每个行业的数据按照年份进行分组,并对每组数据的 p_opr_ass 列进行分箱。
data = pd.read_csv('3.1.处理后数据.csv')
indcd = data['Indcd'].value_counts().index
year = data['Accper'].value_counts().index
data_remo = pd.DataFrame(columns=data.columns) # 新建一个df用于储存
# 按行业分组并排序
data_group = data.sort_values(by='p_opr_ass')
for i in indcd:
d = data_group[data_group['Indcd'].isin([i])].copy() # 按行业分组
for j in year:
d_year = d[d['Accper'].isin([j])].copy() # 按年份分组