在groupby之后的熊猫时间间隔内获取列的唯一值

时间:2018-12-04 19:41:35

标签: python-3.x pandas dataframe pandas-groupby data-analysis

我有一个需求,我需要在特定时间段内在同一张邮票卡上找到用户的商人的store_store_id的所有唯一值。我有按邮票卡ID和用户ID分组以根据条件获取数据帧。现在,我需要在距该条目10分钟的间隔内找到此数据帧的唯一商人_商店_id。

我的方法是,我将在该groupby数据框中循环,然后在该组的该数据框中找到所有索引,然后从索引到索引+ 60分钟的时间创建一个新的数据框,然后在其中找到唯一的merchant_store_id它。如果唯一的merchant_store_id> 1,那么我将从那时开始将该数据帧附加到最终数据帧。这种方法的问题是,它适用于小数据,但对于20,000行大小的数据,它在Linux上显示内存错误,并在Windows上继续运行。下面是我的代码

fi_df = pd.DataFrame()
for i in df.groupby(["stamp_card_id", "merchant_id", "user_id"]):
    user_df = i[1]
    if len(user_df)>1:
        # get list of unique indexes in that groupby df
        index = user_df.index.values
        for ind in index:
            fdf = user_df[ind:ind+np.timedelta64(1, 'h')]
            if len(fdf.merchant_store_id.unique())>1:
                fi_df=fi_df.append(fdf)
fi_df.drop_duplicates(keep="first").to_csv(csv_export_path)

“分组依据”后的采样数据是:

((117, 209, 'oZOfOgAgnO'),     stamp_card_id          stamp_time  stamps_record_id     user_id  \
0             117 2018-10-14 16:48:03              1756  oZOfOgAgnO   
1             117 2018-10-14 16:54:03              1759  oZOfOgAgnO   
2             117 2018-10-14 16:58:03              1760  oZOfOgAgnO   
3             117 2018-10-14 17:48:03              1763  oZOfOgAgnO   
4             117 2018-10-14 18:48:03              1765  oZOfOgAgnO   
5             117 2018-10-14 19:48:03              1767  oZOfOgAgnO   
6             117 2018-10-14 20:48:03              1769  oZOfOgAgnO   
7             117 2018-10-14 21:48:03              1771  oZOfOgAgnO   
8             117 2018-10-15 22:48:03              1773  oZOfOgAgnO   
9             117 2018-10-15 23:08:03              1774  oZOfOgAgnO   
10            117 2018-10-15 23:34:03              1777  oZOfOgAgnO   

    merchant_id  merchant_store_id  
0           209                662  
1           209                662  
2           209                662  
3           209                662  
4           209                662  
5           209                662  
6           209                663  
7           209                664  
8           209                662  
9           209                664  
10          209                663  )

我也尝试过重采样方法,但是随后我分别获得了时间数据,在该时间的结束时间忽略了用户打多个商人_商店ID的条件。

任何帮助将不胜感激。谢谢

1 个答案:

答案 0 :(得分:0)

如果这些是日期时间,则可以使用以下内容进行过滤:

filtered_set = set(df[df["stamp_time"]>=x][df["stamp_time"]<=y]["col of interest"])

df[df["stamp_time"]>=x]过滤df 添加[df["stamp_time"]<=y]可以过滤已过滤的df ["merchant_store_id"]仅捕获指定的列(系列) 最后set()返回唯一列表(集合)


特定于您的代码:

x = datetime(lowerbound) #pseudo-code
y = datetime(upperbound) #pseudo-code
filtered_set = set(fi_df[fi_df["stamp_time"]>=x][fi_df["stamp_time"]<=y]["col of interest"])