繁体   English   中英

在Pandas groupby数据框中选择前n组中存在的值

[英]Select values in Pandas groupby dataframe that are present in n previous groups

我有一个Pandas数据groupby对象,如下所示:

        ID
2014-11-30  1   
        2
        3
2014-12-31  1   
        2
        3
        4
2015-01-31  2   
        3
        4
2015-02-28  1   
        3
        4
        5
2015-03-31  1   
        2
        4
        5
        6
2015-04-30  3   
        4
        5
        6

我想做的是创建另一个数据框,其中groupby日期x中的值是在groupby日期y(x-1)至y(xn)中的每个值,其中y是上一个groupby的n期。 因此,例如,如果n = 1,则如果x groupby period为'2015-04-30',则应对照'2015-03-31'。 如果n = 2,则如果分组日期为'2015-02-28',则应对照分组日期['2015-01-31','2014-12-31']进行检查。

从上面得到的数据帧对于n = 1如下所示:

        ID
2014-12-31  1   
        2
        3
2015-01-31  2   
        3
        4
2015-02-28  3   
        4
2015-03-31  1   
        4
        5
2015-04-30  4   
        5
        6

n = 2的结果数据帧为:

2015-01-31  2   
        3
2015-02-28  3   
        4
2015-03-31  4   
2015-04-30  4   
        5

期待一些pythonic解决方案!

这似乎可行:

def filter_unique(df, n):
    data_by_date = df.groupby('date')['ID'].apply(lambda x: x.tolist())

    filtered_data = {}
    previous = []
    for i, (date, data) in enumerate(data_by_date.items()):
        if i >= n:
            if len(previous)==1:
                filtered_data[date] = list(set(previous[i-n]).intersection(data))
            else:
                filtered_data[date] = list(set.intersection(*[set(x) for x in previous[i-n:]]).intersection(data))
        else:
            filtered_data[date] = data
        previous.append(data)

    result =  pd.DataFrame.from_dict(filtered_data, orient='index').stack()
    result.index = result.index.droplevel(1)

filter_unique(df, 2)

1/31/15     2
1/31/15     3
1/31/15     4
11/30/14    1
11/30/14    2
11/30/14    3
12/31/14    2
12/31/14    3
2/28/15     1
2/28/15     3
3/31/15     1
3/31/15     4
4/30/15     4
4/30/15     5

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM