首页 > 解决方案 > 如何在 30 个数据帧中重复相同的任务 - Python Pandas

问题描述

我有以下数据框(称为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

这是我能想到的最好的解决方案,但我需要两个问题的帮助来进一步优化我的代码/逻辑:

  1. 有没有更简单的方法用更简单的代码触发四分位列?pd.qcut 不允许您有重复的 bin 边缘,因此这不是解决方案。

  2. 我需要跨 30 个其他 pandas 数据帧(aa1、aa2、aa3 等)生成分位数列执行。我不想重复这 30 次,所以那里有解决方案吗?我还没有那么先进的循环。

标签: pythonpandasquantile

解决方案


循环遍历数据帧的解决方案(使用 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

推荐阅读