【发布时间】:2017-04-06 09:36:04
【问题描述】:
使用 pandas cut 我可以通过提供边缘来定义 bin,pandas 会创建像 (a, b] 这样的 bin。
我的问题是如何对垃圾箱进行排序(从最低到最高)?
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'])
我有一个中间结果,其中保留了 bin 的顺序
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
但随后我会进行其他任意更改 bin 顺序的操作:
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
现在我想在条形图中绘制数据,但我希望将 bin 从最低 (-3, -0.5] 到最高 (0.5, 3]) 排序。
我想我可以通过操作字符串,在“,”上使用拆分然后清理括号来实现这一点,但我想知道是否有更好的方法。
【问题讨论】:
-
我认为您的问题归结为被表示为包含浮点值的字符串的间隔,这些值本质上难以排序。将间隔转换为 python 元组怎么样?例如
import ast; x2 = x2.map(lambda r: ast.literal_eval(r.replace(']', ')')))。这使得以后对它们进行排序非常容易。 -
为什么bin的原始数字顺序完全丢失了?