在熊猫的输出中添加唯一值

时间:2018-10-08 16:34:46

标签: python python-3.x pandas pandas-groupby

import pandas as pd
data = {'numbers' : [1, 2, 3, 1, 3, 2, 2, 3, 3, 1, 2, 1, 1, 2, 3],
'colors' : ['red', 'yellow', 'red', 'green', 'blue', 'purple', 'blue', 'blue', 'green', 'blue', 'purple', 'blue', 'blue', 'purple', 'red']}
df = pd.DataFrame(data)

temp = df.groupby('numbers').colors.apply(' --> '.join)

我早些时候在代码方面获得了一些帮助,但是现在我陷入了另一步... 当前输出如下:

1 red --> green --> blue --> blue --> blue
2 yellow --> purple --> blue --> purple --> purple
3 red --> blue --> blue --> green --> red 

但是我需要汇总相似的值,以便输出看起来像这样:

1 red --> green --> blue x3
2 yellow --> purple --> blue --> purple x2
3 red --> blue x2 --> green --> red 

我尝试使用类似的东西

['colors'].count()

但是,当我寻找彼此相邻的重复值时,这会计算所有值。

1 个答案:

答案 0 :(得分:4)

使用itertools.groupby定义自定义函数:

设置

import itertools

def foo(arr):
    for i, g in itertools.groupby(arr):
        l = len(list(g))
        if l > 1:
            yield f'{i} x{l}'   # yield '{i} x{l}'.format(i=i, l=l)
        else:
            yield i

def bar(vals):
    return ' --> '.join(foo(vals))

现在apply

df.groupby('numbers').colors.apply(bar)

numbers
1                   red --> green --> blue x3
2    yellow --> purple --> blue --> purple x2
3           red --> blue x2 --> green --> red
Name: colors, dtype: object