【问题标题】:Select values in Pandas groupby dataframe that are present in n previous groups选择前 n 个组中存在的 Pandas groupby 数据帧中的值
【发布时间】:2015-12-16 05:18:46
【问题描述】:

我有一个 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(x-n) 中的值,其中 y 是前一个 groupby 的 n 周期。因此,例如,如果 n=1,那么如果 x groupby period 为“2015-04-30”,那么您将检查“2015-03-31”。如果 n=2,那么如果 groupby 日期为 '2015-02-28',那么您将检查 groupby 日期 ['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的解决方案!

【问题讨论】:

    标签: python pandas group-by


    【解决方案1】:

    这似乎可行:

    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
    

    【讨论】:

    • 这确实有效,所以谢谢。我认为可能有一种更有效的方法。会让我睁大眼睛看一个。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-03
    • 2021-12-01
    • 2021-07-11
    • 1970-01-01
    • 1970-01-01
    • 2018-08-26
    • 1970-01-01
    相关资源
    最近更新 更多