python csv文件内部循环分箱

问题遇到的现象和发生背景

一次循环下分箱可以运行,但两次循环下分箱就会报错

遇到的现象和发生背景,请写出第一个错误信息

ValueError: Bin edges must be unique: array([1., 1., 1., 1.]).
You can drop duplicate edges by setting the 'duplicates' kwarg

用代码块功能插入代码,请勿粘贴截图。 不用代码块回答率下降 50%
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

我的解答思路和尝试过的方法,不写自己思路的,回答率下降 60%
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()   # 按年份分组