在pandas数据框中的groupby之后滚动前3个月的唯一计数

时间:2017-06-29 03:41:38

标签: python python-3.x pandas

以下是数据框

for(Map.Entry<Integer,String> entry:map1.entrySet()){
    qaMap.put(entry.getValue(),map2.get(entry.getKey()));
}

预期产出:

Date        Name     data
01/01/2017  Alpha     A      
02/01/2017  Alpha     A
03/01/2017  Alpha     B
01/01/2017  Beta      A
01/20/2017  Beta      D
03/01/2017  Beta      C
04/01/2017  Beta      C
05/01/2017  Beta      B

我正在寻找&#34;数据&#34;的独特数量。分组&#34;名称&#34;在3个月的滚动基础上。考虑&#34; 2017年3月&#34;的例子。和&#34;姓名&#34; - &GT; &#34;β&#34 ;.所以考虑的月份是2017年1月,2017年2月,2017年3月的名称&#34; Beta&#34;。唯一计数为3.与其他人类似。 请注意&#34;数据&#34;这3个月应该是唯一的

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

每月组Name,取消堆叠并重新采样到月份,因此所有月份都存在,每个Name

df2 = df.groupby([pd.TimeGrouper('M'), 'Name', ])['data'].apply(set).unstack().resample('M').sum()
  

DF2

Name        Alpha   Beta
Date        
2017-01-31  {A}     {A, D}
2017-02-28  {A}     None
2017-03-31  {B}     {C}
2017-04-30  None    {C}
2017-05-31  None    {B}

多个迭代器

一些itertools魔法在同一列上多次迭代

def multiple_iterator(iterable, r=2):
    iterators = itertools.tee(iterable, r)
    try:
        for i, it in enumerate(iterators):
            for j in range(i):
                next(it)
    except StopIteration:
        return None
    return iterators

真正的工作

def get_unique_items_rolling(df, period):
    for col_name, col in df2.iteritems():
        s = pd.Series()
#         print(f'---{col_name}---')
        for idx, *iterators in zip(col.index[period-1:], *multiple_iterator(col, period)):
            result = set(itertools.chain.from_iterable(i for i in iterators if pd.notnull(i) and i))
#             print(idx, result)
            s[idx] = result
        yield col_name, s
  

df3 = pd.DataFrame.from_items(get_unique_items_rolling(df2, period))

            Alpha   Beta
2017-03-31  {A, B}  {A, D, C}
2017-04-30  {A, B}  {C}
2017-05-31  {B}     {B, C}
  

df3.stack().apply(len)

Date        Name 
2017-03-31  Alpha    2
            Beta     3
2017-04-30  Alpha    2
            Beta     1
2017-05-31  Alpha    1
            Beta     2
dtype: int64