python - 在 Python 中对系列进行分组

标签 python matplotlib

标题编辑:固定大小写并添加“for python”。

是否有更好或更标准的方法来完成我所描述的事情? 我想要这样的输入:

[1, 1, 1, 0, 2, 2, 0, 2, 2, 0, 0, 3, 3, 0, 1, 1, 1, 1, 1, 2, 2, 2 ]

转换成这样:

[0, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 2, 0 ]

或者,更好的是,像这样的东西(以不同方式描述相似的输出,但现在不限于整数):

标签:[1, 2, 3, 1, 2]

位置(根据我的 matplotlib 绘图,其中 1 标识第一个可占用位置):[2, 7, 12.5, 17, 21]

输入数据是对图进行分类的分类数据 - 在下图中,分组图共享一个分类特征,我只想为该组标记一次。我将为两个不同的变量使用 2 个轴,但我认为这不是重点。

注意:此图像不反射(reflect)任何一组示例数据 - 它只是为了理解将类别组合在一起的想法。 a组应该标记为x=5,因为前两个和第二个垂直数据组之间有一个空格,0是右边的线。

Image demonstrating placement of tick marks in the center of a category of data

这是我得到的:

data = [1, 1, 1, 2, 2, 2, 2, 2, 3, 4, 3, 2, 2, 1, 1, 1, 1]
last = None
runs = []
labels = []
run = 1
for x in data:
    if x in (last, 0):
        run += 1
    else:
        runs.append(run)
        run = 1
        labels.append(x)
    last = x
runs.append(run)
runs.pop(0)
labels.append(x)
tick_positions = [0]
last_run = 1
for run in runs:
    tick_positions.append(run/2.0+last_run/2.0+tick_positions[-1])
    last_run = run
tick_positions.pop(0)
print tick_positions

最佳答案

要获取标签,您可以使用 itertools groupby :

>>> import itertools
>>> numbers = [1, 1, 1, 0, 2, 2, 0, 2, 2, 0, 0, 3, 3, 0, 1, 1, 1, 1, 1, 2, 2, 2]
>>> list(k for k, g in itertools.groupby(numbers))
[1, 0, 2, 0, 2, 0, 3, 0, 1, 2]

要删除零,您可以使用理解:

>>> list(k for k, g in itertools.groupby(x for x in numbers if x != 0))
[1, 2, 3, 1, 2]

如果您也想获得这些位置,那么您必须像您已经在做的那样自己遍历列表。 groupby 不会为您跟踪。

关于python - 在 Python 中对系列进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4937163/

相关文章:

Python 将格式化方法与使用 LaTeX 的长字符串相结合

在导入 swig 生成的包装器的模块中使用 matplotlib 绘图时 Python 崩溃

python-3.x - 如何绘制 sklearn 的 GridSearchCV 结果与参数的关系图?

python - matplotlib 非常慢。正常吗?

python - 如何使用 %s 替换 python 文件中的文本?

python - 如何替换具有特定文本的行

python - 忽略 pypi 上的 .git 目录

python Pandas : Groupby Sum AND Concatenate Strings

python - Pandas 数据框使每个唯一的 ID 号 NAT

Matplotlib: add_lines 到具有定义属性的颜色条(颜色:OK;虚线:不OK)