首页 > 解决方案 > 如何使用 Python 计算数据随时间的变化

问题描述

对于以下数据框,我需要为每组日期、location_id、uid计算'count'的变化,并将该组包含在结果中。

# Sample DataFrame

df = pd.DataFrame({'date': ['2021-01-01', '2021-01-01','2021-01-01','2021-01-02', '2021-01-02','2021-01-02'], 
                   'location_id':[1001,2001,3001, 1001,2001,3001],
                   'uid': ['001', '003', '002','001', '004','002'],
                   'uid_count':[1, 2,3 ,2, 2, 4]})

    date    location_id uid count
0   2021-01-01  1001    001 1
1   2021-01-01  2001    003 2
2   2021-01-01  3001    002 3
3   2021-01-02  1001    001 2
4   2021-01-02  2001    004 2
5   2021-01-02  3001    002 4

我想要的结果如下所示:

# Desired Results

date        location_id  uid
2021-01-01  1001         001    0
            2001         003    0
            3001         002    0
2021-01-02  1001         001    1
            2001         004    0
            3001         002    1

我想我可以通过groupby使用以下方法来做到这一点,但没有进行所需的计算:

# Current code:
df.groupby(['date','location_id','uid'],sort=False).apply(lambda x: (x['count'].values[-1] - x['count'].values[0]))

# Current results:
date        location_id  uid
2021-01-01  1001         001    0
            2001         003    0
            3001         002    0
2021-01-02  1001         001    0
            2001         004    0
            3001         002    0

我怎样才能得到想要的结果?

标签: python-3.xpandas

解决方案


  • 以下代码适用于测试数据框,我不确定更大的数据框
  • .transform()用于计算 的连续出现的差异'uid_count',对于每个uid,具有与 相同的索引df
  • , 的问题.groupby(['date','location_id','uid']是每个组只包含一个值。
  • 如果需要'uid_count',在末尾删除。.drop(columns='uid_count')
import pandas as pd

# sort the dataframe
df = df.sort_values(['date', 'location_id', 'uid'])

# groupby and transform based on the difference in uid_count
uid_count_diff = df.groupby(['location_id', 'uid']).uid_count.transform(lambda x: x.diff()).fillna(0).astype(int)

# create a column in df
df['uid_count_diff'] = uid_count_diff

# set the index
df = df.set_index(['date', 'location_id', 'uid'])

# result
                            uid_count  uid_count_diff
date       location_id uid                           
2021-01-01 1001        001          1               0
           2001        003          2               0
           3001        002          3               0
2021-01-02 1001        001          2               1
           2001        004          2               0
           3001        002          4               1

推荐阅读