我有以下数据框(称为 aa1 ):
d = {'Index' : pd.Series([25, 7, 7, 5, 5, 8])}
aa1 = pd.DataFrame(d)
我创建了一个名为 Quartile_Index 的新列,该列对 Index 列值的四分位数进行了评分 (注意:这是我能找到的最佳解决方案,因为pd.qcut库不允许您有重复的bin边缘):
quantile_frame = aa1.quantile(q=[0.25, 0.5, 0.75])
quantile_ranks = []
for index, row in aa1.iterrows():
if (row['Index'] <= quantile_frame.ix[0.25]['Index']):
quantile_ranks.append('q1')
elif (row['Index'] >= quantile_frame.ix[0.25]['Index'] and row['Index'] <= quantile_frame.ix[0.5]['Index']):
quantile_ranks.append('q2')
elif (row['Index'] >= quantile_frame.ix[0.5]['Index'] and row['Index'] <= quantile_frame.ix[0.75]['Index']):
quantile_ranks.append('q3')
else:
quantile_ranks.append('q4')
aa1['Quartile_Index'] = quantile_ranks
这是我能想到的最好的解决方案,但是我需要两个问题的帮助来进一步优化我的代码/逻辑:
是否有更简单的方法用更简单的代码触发四分位数列? pd.qcut不允许您具有重复的纸槽边缘,因此这不是解决方案。
我需要在其他30个熊猫数据帧( aa1 ,aa2,aa3等)上产生分位数列执行。我不想重复30次,所以那里有解决方案吗?我还没有循环那么先进。
答案 0 :(得分:0)
遍历数据帧的解决方案(使用iloc代替.ix []):
data = [aa1,aa2]
for i in data:
quantile_frame = i.quantile(q=[0.25, 0.5, 0.75])
quantile_ranks = []
for index, row in i.iterrows():
if (row['Index'] <= quantile_frame.iloc[0]['Index']):
quantile_ranks.append('q1')
elif (row['Index'] >= quantile_frame.iloc[0]['Index'] and row['Index'] <= quantile_frame.iloc[1]['Index']):
quantile_ranks.append('q2')
elif (row['Index'] >= quantile_frame.iloc[1]['Index'] and row['Index'] <= quantile_frame.iloc[2]['Index']):
quantile_ranks.append('q3')
else:
quantile_ranks.append('q4')
i['Quartile_Index'] = quantile_ranks