我不确定我的问题是否可以解决,但我想我会尝试;无论如何,搜索都没有结果。
任务:我有一个大型数据集 - 大约40k元素。根据评估者的熟悉程度对这些进行评级(即,如果项目的评级为0.75,这意味着75%的评估者都熟悉它)。我想将这些数据分成4个大小相同的箱子。这样做的自然方法是使用pandas的“分位数”函数来获得四分位数范围
问题:我100%的参与者都知道53%的数据。这意味着我的两个分位数具有相同的值。因此,将分位数函数的结果输入到我的代码中会为其中一个分位数提供一个空的bin,因为第一个bin获取所有值(请参阅下面的代码。)
有人知道在四个偶数组中分割我的数据,即使两组中的所有数据具有相同的值吗?我想重新使用这个代码,所以如果指定一个特定的索引范围来挑选四分之一的数据,就会使这个数据集过于特定。
非常感谢!
data3 = pd.read_csv('filepath.csv')
######### Empty lists to take variables
well = [] # Well-known elements
medwell = [] # Medium well known elements
med = [] # medium known elements
low = [] # Rarely known elements
############# Binning of data by familiarity
for i in range(39953):
if data3['Percent_known'][i] >= data3['Percent_known'].quantile(0.75):
well.append(data3['Word'][i]) # Familiarity
elif data3['Percent_known'][i] >= data3['Percent_known'].quantile(0.50) and \
data3['Percent_known'][i] < data3['Percent_known'].quantile(0.75):
medwell.append(data3['Word'][i])
elif data3['Percent_known'][i] >= data3['Percent_known'].quantile(0.25) and \
data3['Percent_known'][i] < data3['Percent_known'].quantile(0.50):
med.append(data3['Word'][i])
else:
low.append(data3['Word'][i])
答案 0 :(得分:2)
我会向Percent_known
添加一个小的随机抖动。通过这种方式,您将能够(随机)将100%已知的所有项目分类为分位数。
# create data
df = pd.DataFrame([1, 1, 1, 1, 0.5, 0.5, 0, 0], columns=['known'])
df['fudge'] = df.known + 0.01 * (np.random.rand(len(df)) - 0.5)
df.known[df.fudge > df.fudge.quantile(0.75)]
最后一行将在已知100%的人中随机选择四分之一的项目。
另外,以矢量化方式而不是循环计算分位数会更有效。例如:
df['quant'] = np.nan
for q in [0.75, 0.5, 0.25]:
df.loc[(df.fudge <= df.fudge.quantile(q + 0.25)) & (df.fudge > df.fudge.quantile(q)), 'quant'] = q
df.quant.fillna(0.0, inplace=True)