从pandas groupby操作结果构造超集

时间:2017-03-22 00:09:48

标签: python pandas

name_region
bahia                    [10, 11, 12, 1, 2, 3, 4]
distrito_federal      [9, 10, 11, 12, 1, 2, 3, 4]
goias                 [9, 10, 11, 12, 1, 2, 3, 4]
maranhao                 [10, 11, 12, 1, 2, 3, 4]
mato_grosso           [9, 10, 11, 12, 1, 2, 3, 4]
mato_grosso_do_sul    [8, 9, 10, 11, 12, 1, 2, 3]

我上面有一个pandas系列,是从groupby操作中获得的。第二列代表一年中的几个月。我如何构建月份的超集,即[8, 9, 10, 11, 12, 1, 2, 3, 4],因为它代表了所有可能的月份 数据集

- 注: 我确实想保留订单

3 个答案:

答案 0 :(得分:1)

我似乎误解了问题中的数据结构,但由于它可能对类似情况有用,我会在此处保留此答案以供将来参考。

您可以使用numpy的独特功能。

import pandas as pd
import numpy as np

df = pd.DataFrame({"x": [1,3,5], "y": [3,4,5]})

print np.unique(df) # prints [1 3 4 5]

答案 1 :(得分:1)

我不知道是否有办法在Pandas中更干净地做到这一点,所以如果有其他人知道请回答......看看这些类型,这似乎是折叠该列的时间。

我没有在熊猫中看到折叠操作,所以也许只是一个累积的for循环..即

all_months = []
for row in df.iterrows():
    months = row['months']
    all_months += [e for e in months if not e in all_months]

第二个想法..将使用set而不是复杂的理解

all_months = set()
for row in df.iterrows():
    months = set(row['months'])
    all_months = all_months.union(months)
嗯刚刚看到其他人回答,没有测试过它......但它看起来更好!选择那个:)。发布这个以防它有助于某人......

答案 2 :(得分:1)

您可以使用itertools recipe unique_everseen(保留订单),如下所示:

>>> [i for i in unique_everseen([z for z in y['months'] for x,y in df.iterrows()])]
[9, 10, 11, 12, 1, 2, 3, 4]

unique_everseen的定义:

import itertools as it
def unique_everseen(iterable, key=None):
    "List unique elements, preserving order. Remember all elements ever seen."
    # unique_everseen('AAAABBBCCDAABBB') --> A B C D
    # unique_everseen('ABBCcAD', str.lower) --> A B C D
    seen = set()
    seen_add = seen.add
    if key is None:
        for element in it.ifilterfalse(seen.__contains__, iterable):
            seen_add(element)
            yield element
    else:
        for element in iterable:
            k = key(element)
            if k not in seen:
                seen_add(k)
                yield element