python - 如何一次对数据中的所有列进行分类? (使所有值变为高、中、低)

标签 python pandas dataframe categorical-data

我正在尝试将我的数据集中的所有值转换为分类值,我希望根据它们的分位数值将所有数值分类为低、平均值或高。

所以如果这个值低于系列的25%,就会被转换为“Low”

我尝试使用 assign 然后应用我提供的函数:

def turn_into_categorical(row):
    quantile_level = [.25, .5, .75]
    for r in row:
        cut = refugees_T_F_V_P_full_data.r.quantile(quantile_level)
        if r >= cut[.75]:
            return "High"
        elif r >= cut[.25] and r < cut[0.75]:
            return "Average"
        else:
            return "Low"

refugees_T_F_V_P_full_data.apply(turn_into_categorical, axis = 1)

但是,代码运行不正常。我也通过 iterrows 尝试过,但我想知道是否有更快的方法?

这是我要转换的数据,除年和月外的所有数字都应根据其分位数值分为低、中、高。

    Year  Month  Central Equatoria  Eastern Equatoria  Gogrial  Jonglei
0   2014     10                6.0                1.0      0.0      3.0   
1   2014     11                4.0                3.0      0.0     12.0   
2   2014     12                3.0                5.0      0.0     11.0   
3   2015      1                7.0                2.0      0.0      4.0   
4   2015      2                5.0                5.0      0.0     10.0   
5   2015      3                7.0                5.0      0.0      8.0   
6   2015      4                4.0                1.0      0.0      6.0   
7   2015      5                5.0                0.0      0.0      7.0   
8   2015      6                4.0                1.0      0.0      6.0   
9   2015      7               15.0                2.0      0.0      9.0   
10  2015      8               10.0                7.0      0.0      9.0   
11  2015      9               12.0                0.0      0.0      8.0   
12  2015     10               12.0                0.0      0.0      5.0   
13  2015     11                8.0                5.0      0.0     10.0   
14  2015     12                5.0                7.0      0.0      3.0 

预期结果:(示例)

    Year  Month  Central Equatoria  Eastern Equatoria  Gogrial  Jonglei
0   2014     10                High             Medium      Low      Medium  
1   2014     11                Low              Medium      Low     high

最佳答案

看起来你想要pd.qcut ,正是这样做的。来自文档:

Quantile-based discretization function

所以你可以 apply pd.qcut 沿着从 Central Equatoria 开始的数据帧的列,指定要用于对系列进行装箱的分位数 q = [0, 0.25 , 0.75, 1.0]

df.loc[:,'Central Equatoria':].apply(lambda x: pd.qcut(x, q=[0, 0.25, 0.75, 1.0], 
                                    labels =['low','medium','high']) 
                                    if not x.nunique() == 1 else 'low'))

输出

       Central Equatoria Eastern Equatoria Gogrial Jonglei
0            medium              low     low     low
1               low           medium     low    high
2               low           medium     low    high
3            medium           medium     low     low
4            medium           medium     low    high
5            medium           medium     low  medium
6               low              low     low  medium
7            medium              low     low  medium
8               low              low     low  medium
9              high           medium     low  medium
10             high             high     low  medium
11             high              low     low  medium
12             high              low     low     low
13           medium           medium     low    high
14           medium             high     low     low

关于python - 如何一次对数据中的所有列进行分类? (使所有值变为高、中、低),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54369807/

相关文章:

python - 根据值数组的条件在 pandas 中分配值

python - 扭曲的 python 卡在大型多部分消息上

python - Django直接返回.html文件,根本不解析模板标签

pandas - 如何更改散点图色调图例 handle

python - Pandas DataFrame - 测试更改/修改

python - Pandas DataFrame 合并选择更高的值

python - 该帐户不可用 : Unable to switch user in python alpine docker container

python - matplotlib: AttributeError: 'AxesSubplot' 对象没有属性 'add_axes'

python - 更改 networkx 图中节点的顺序/位置

python - 如何选择数据框中列的每个类别?