从大熊猫中分拣出的垃圾箱[英] Sort bins from pandas cut

本文是小编为大家收集整理的关于从大熊猫中分拣出的垃圾箱的处理方法,想解了从大熊猫中分拣出的垃圾箱的问题怎么解决?从大熊猫中分拣出的垃圾箱问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

使用pandas cut 我可以通过提供边缘和熊猫创建bin,例如(a, b].

我的问题是如何对垃圾箱进行分类(从最低到最高)?

import numpy as np
import pandas as pd

y = pd.Series(np.random.randn(100))

x1 = pd.Series(np.sign(np.random.randn(100)))
x2 = pd.cut(pd.Series(np.random.randn(100)), bins = [-3, -0.5, 0, 0.5, 3])

model = pd.concat([y, x1, x2], axis = 1, keys = ['Y', 'X1', 'X2'])

我有一个中间结果,保留了垃圾箱的顺序

int_output = model.groupby(['X1', 'X2']).mean().unstack()
int_output.columns = int_output.columns.get_level_values(1)

X2    (-3, -0.5]  (-0.5, 0]  (0, 0.5]  (0.5, 3]
X1                                             
-1.0    0.101475  -0.344419 -0.482992 -0.015179
 1.0    0.249961   0.484757 -0.066383 -0.249414

,但随后我进行了其他操作,以任意更改垃圾箱的顺序:

output = pd.concat(int_output.to_dict('series'), axis = 1)

      (-0.5, 0]  (-3, -0.5]  (0, 0.5]  (0.5, 3]
X1                                             
-1.0  -0.344419    0.101475 -0.482992 -0.015179
 1.0   0.484757    0.249961 -0.066383 -0.249414

现在,我想在条形图中绘制数据,但我希望将垃圾箱从最低(-3,-0.5]分类为最高(0.5,3].

我认为我可以通过使用""拆分,然后清洁支架来操纵字符串来实现这一目标,但是我想知道是否有更好的方法.

推荐答案

失去主要问题ordered html" CategoricalIndex .

np.random.seed(12456)
y = pd.Series(np.random.randn(100))
x1 = pd.Series(np.sign(np.random.randn(100)))
x2 = pd.cut(pd.Series(np.random.randn(100)), bins = [-3, -0.5, 0, 0.5, 3])

model = pd.concat([y, x1, x2], axis = 1, keys = ['Y', 'X1', 'X2'])
int_output = model.groupby(['X1', 'X2']).mean().unstack()
int_output.columns = int_output.columns.get_level_values(1)

print (int_output)
X2    (-3, -0.5]  (-0.5, 0]  (0, 0.5]  (0.5, 3]
X1                                             
-1.0    0.230060  -0.079266 -0.079834 -0.064455
 1.0   -0.451351   0.268688  0.020091 -0.280218

print (int_output.columns)
CategoricalIndex(['(-3, -0.5]', '(-0.5, 0]', '(0, 0.5]', '(0.5, 3]'], 
                 categories=['(-3, -0.5]', '(-0.5, 0]', '(0, 0.5]', '(0.5, 3]'], 
                 ordered=True, name='X2', dtype='category')

output = pd.concat(int_output.to_dict('series'), axis = 1)
print (output)
      (-0.5, 0]  (-3, -0.5]  (0, 0.5]  (0.5, 3]
X1                                             
-1.0  -0.079266    0.230060 -0.079834 -0.064455
 1.0   0.268688   -0.451351  0.020091 -0.280218

print (output.columns)
Index(['(-0.5, 0]', '(-3, -0.5]', '(0, 0.5]', '(0.5, 3]'], dtype='object')

一种可能的解决方案是 extract extract extract extract extract extract extract output.columns的第一个数字,创建助手系列并进行排序.最后/p>

cat = output.columns.str.extract('\((.*),', expand=False).astype(float)
a = pd.Series(cat, index=output.columns).sort_values()
print (a)
(-3, -0.5]   -3.0
(-0.5, 0]    -0.5
(0, 0.5]      0.0
(0.5, 3]      0.5
dtype: float64

output = output.reindex(columns=a.index)
print (output)
      (-3, -0.5]  (-0.5, 0]  (0, 0.5]  (0.5, 3]
X1                                             
-1.0    0.230060  -0.079266 -0.079834 -0.064455
 1.0   -0.451351   0.268688  0.020091 -0.280218

其他推荐答案

可以简单地解决您上面突出显示的问题的一个简单解决方案,就是重新排序列:

output[sorted(output.columns)]

其他推荐答案

我做了一个函数.

def dfsortbybins(df, col):
    """
    param df: pandas dataframe
    param col: name of column containing bins
    """
    d=dict(zip(bins,[float(s.split(',')[0].split('(')[1]) for s in bins]))
    df[f'{col} dfrankbybins']=df.apply(lambda x : d[x[col]] if not pd.isnull(x[col]) else x[col], axis=1)
    df=df.sort_values(f'{col} dfrankbybins').drop(f'{col} dfrankbybins',axis=1)
    return df

本文地址:https://www.itbaoku.cn/post/1727913.html