我有一些数据需要根据某种度量(小时率)划分为4个相等的区域。在某些情况下,我数据框中的某些行具有相同的每小时费用。大多数时候,这不会造成问题。但是在某些情况下,某些共享相同“小时费率”的数据进入一个仓,而其余数据进入另一个仓。我的要求是,这两个计数(一个放入第一个垃圾箱,一个放入第二个垃圾箱)必须由男人(或男人)平均组成(或尽可能相等)。
例如,如果8个人(每小时4个男性和4个女性)的时薪相同,并且其中2个位于1号垃圾箱中,而6个位于2号垃圾箱中,我希望性别为50%-50%每个垃圾箱中的百分比(垃圾箱1中的1个男性和1个女性,其余的在垃圾箱2中)。
另一个例子,如果6个人(每小时4个男性和2个女性)的时薪相同,并且其中3个在垃圾箱1中,而3个在垃圾箱2中,我想在垃圾箱中有2个男性和1个女性1个垃圾箱中有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统计信息):
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]
然后,我不知道该如何进行。谁能提供任何想法?
此外,如果您对如何提高此代码的效率有任何建议,我希望听到它。
谢谢!