python - 如何使用单独的值范围对 pandas 数据框中的值进行分位数

标签 python pandas

我有一个数据框,我想将“接近”值分组到当天的相应范围内。 (范围=高低差)。
我需要 5 个分位数。 Q1、Q2、M、Q4、Q5。
示例:最低价 100、最高价 200、收盘价 125 = 第二季度

这是 df:

             Low    High    range   close
             amin   amax        
Date                
2019-06-20  2918.00 2946.75 115.0   2943.00
2019-06-21  2930.00 2951.50 86.0    2933.25
2019-06-24  2931.00 2944.00 52.0    2934.50
2019-06-25  2902.25 2935.25 132.0   2903.50
2019-06-26  2899.00 2921.25 89.0    2900.25
2019-06-27  2900.00 2918.00 72.0    2913.25
2019-06-28  2913.00 2937.50 98.0    2937.00
2019-07-01  2937.75 2964.00 105.0   2950.50
2019-07-02  2940.75 2962.25 86.0    2962.00
2019-07-03  2957.75 2983.75 104.0   2983.25
2019-07-04  2979.50 2986.00 26.0    2984.50
2019-07-05  2953.50 2986.25 131.0   2972.75
2019-07-08  2955.50 2971.00 62.0    2960.50
2019-07-09  2945.75 2968.50 91.0    2964.50
2019-07-10  2953.50 2989.75 145.0   2988.50

我正在尝试通过循环来完成此任务。数组将被填充,但我无法将值分配给数据框。

low = df.loc[:, ('Low', 'amin')]

def q():
    
    qarray = []
    
    for i in range(len(df)):
        
        if ((df.close[i] - low[i])/0.25)/df.range[i]*100 > 0 and ((df.close[i] - low[i])/0.25)/df.range[i]*100 <= 20:
            qarray.append('Q1')
        if ((df.close[i] - low[i])/0.25)/df.range[i]*100 > 20 and ((df.close[i] - low[i])/0.25)/df.range[i]*100 <= 40:
            qarray.append('Q2')
        if ((df.close[i] - low[i])/0.25)/df.range[i]*100 > 40 and ((df.close[i] - low[i])/0.25)/df.range[i]*100 <= 60:
            qarray.append('M')  
        if ((df.close[i] - low[i])/0.25)/df.range[i]*100 > 60 and ((df.close[i] - low[i])/0.25)/df.range[i]*100 <= 80:
            qarray.append('Q4')      
        if ((df.close[i] - low[i])/0.25)/df.range[i]*100 > 80:
            qarray.append('Q5')          
    return qarray  

df['q'] = q()

我收到此警告消息:

/opt/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:23: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy

如何将 qarray 中的值获取到数据帧?还有,有没有一种更Python式的方法来完成这个任务?

最佳答案

Stanvooz,这应该可以做到:

df["q"] = pd.qcut((df["close"] - df["low"]), q=[0, 0.2, 0.4, 0.6, 0.8, 1], labels=["Q1", "Q2", "M", "Q3", "Q4"])

查看您的要求后,我认为 qcut 不适用于您的情况。 qcut 适用于列,您正在做的是行(至少这是我的观点)。我认为下面的解决方案更加Pythonic并且避免了循环。它对我来说适用于您的数据,没有错误消息。我正在使用 pandas v 1.0.1

_ranges = np.array([0, 20, 40, 60, 80, 100])
_map = {1: "Q1", 2: "Q2", 3: "M", 4: "Q4", 5: "Q5"} # maps label to an appropriate range

df["derive"] = ((df["close"].values - df["low"].values) / 0.25) / df["range"].values * 100 # intermediate step
df["q"] = df["derive"].apply(lambda x: _map[(x > _ranges).sum()])
df.drop("derive", axis=1, inplace=True)

关于python - 如何使用单独的值范围对 pandas 数据框中的值进行分位数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62942815/

相关文章:

python - 当我在 pandas 中使用 diff(periods=1) 计算时间间隔时出现错误

python - 合并 2 个 csv 文件 - html 编码

python - 在 Python 中使用 Scrapy 抓取数据

python - 使用 Python 和 BeautifulSoup 抓取时模拟单击链接

python - HDBSCAN Python 选择簇数

python - Pandas 系列改造

python - Django - 对象的社交类权限

Python数据帧: Standard deviation of last one year of data

python - 省略 pandas 中带有空字段的行

python - 将列表的 Pandas 数据框列转换为每列的 numpy 数组