首页 > 解决方案 > 在数据框列上分配交替值

问题描述

我有一些数据需要根据某个度量(每小时费率)分成 4 个相等的箱子。在某些情况下,我的数据框中的某些行具有相同的小时费率。大多数情况下,这不会造成问题。但是在某些情况下,共享相同小时费率的一些数据进入一个容器,而其余数据进入另一个容器。我的要求是这两个计数(进入第一个垃圾箱的一个和进入第二个垃圾箱的一个)由男性和女性平等组成(或尽可能平等)。

例如,如果 8 个人,4 男 4 女,每小时费率相同,其中 2 人在 bin 1 中,而其中 6 人在 bin 2 中,我希望每个人的性别百分比为 50%-50% bin(1 男 1 女在 bin 1 中,其余在 bin 2 中)。

另一个例子,如果 6 个人,4 男 2 女,每小时费率相同,其中 3 人在 bin 1,而 3 在 bin 2,我想在 bin 1 有 2 男 1 女,并且2 号仓 2 男 1 女。

我正在发送一个示例数据框,并解释了我到目前为止所做的事情:

data = [[1, 'M', 5.00] , [2, 'F', 5.00] , [3, 'M', 7.00] , [4, 'M', 8.00] , [5, 'M', 8.00] ,
    [6, 'F', 8.00] , [7, 'F', 8.00] , [8, 'F', 8.00] , [9, 'F', 8.00] , [10, 'M', 10.00] ,
    [11, 'M', 11.00] , [12, 'F', 12.00] , [13, 'M', 15.00] , [14, 'M', 15.00] , [15, 'M', 15.00] ,
    [16, 'F', 15.00] , [17, 'F', 15.00] , [18, 'M', 16.00] , [19, 'F', 17.00] , [20, 'F', 20.00]]

df = pd.DataFrame(data, columns = ['Pers. Number', 'Gender', 'Hourly Rate'])

我对我的数据进行排名,为每个原始数据提供独特的排名(我为此使用 scipy stats):

df["Hourly Rate Rank"] = ss.rankdata(df['Hourly Rate'], method='ordinal')

然后我创建垃圾箱:

hrtotal = df['Hourly Rate'].count()

def HRQuartile(row):
    if row['Hourly Rate Rank'] <= hrtotal/4:
        val = 1
    elif row['Hourly Rate Rank'] <= (hrtotal/4)*2:
        val = 2
    elif row['Hourly Rate Rank'] <= (hrtotal/4)*3:
        val = 3
    else:
        val = 4
    return val

df['Hourly Rate Quartile'] = df.apply(HRQuartile, axis=1)

所以到这里它工作正常,我得到了我的排名和我的平等垃圾箱。

现在,我执行以下操作来获得有问题的四分位数:

f = df.groupby(['Hourly Rate Quartile', 'Hourly Rate']).size().reset_index(name='Count')

ff = f[f.groupby(['Hourly Rate'])['Hourly Rate Quartile'].transform('nunique')>1]

而且,在那之后我不知道如何进行。任何人都可以提供任何想法吗?

另外,如果您对如何使此代码更高效有任何建议,我很乐意听到。

谢谢!

标签: pythonpandasdataframedata-science

解决方案


推荐阅读