如何使用 group by 获取唯一 ID 的累计和?
How to get cumulative sum of unique IDs with group by?
我对 python 和 pandas 非常陌生,正在处理看起来像
的 pandas 数据框
Date Time ID Weight
Jul-1 12:00 A 10
Jul-1 12:00 B 20
Jul-1 12:00 C 100
Jul-1 12:10 C 100
Jul-1 12:10 D 30
Jul-1 12:20 C 100
Jul-1 12:20 D 30
Jul-1 12:30 A 10
Jul-1 12:40 E 40
Jul-1 12:50 F 50
Jul-1 1:00 A 40
我正在尝试按日期、时间和 ID 进行分组并应用累积和,这样如果下一个时隙中存在 ID,则权重仅添加一次(唯一)。生成的数据框如下所示
Date Time Weight
Jul-1 12:00 130 (10+20+100)
Jul-1 12:10 160 (10+20+100+30)
Jul-1 12:20 160 (10+20+100+30)
Jul-1 12:30 160 (10+20+100+30)
Jul-1 12:40 200 (10+20+100+30+40)
Jul-1 12:50 250 (10+20+100+30+40+50)
Jul-1 01:00 250 (10+20+100+30+40+50)
这是我在下面尝试的方法,但是这仍然多次计算权重:
df=df.groupby(['date','time','ID'])['Wt'].apply(lambda x: x.unique().sum()).reset_index()
df['cumWt']=df['Wt'].cumsum()
非常感谢任何帮助!
提前致谢!!
下面的代码使用 pandas.duplicate(), pandas.merge(), pandas.groupby/sum and pandas.cumsum() 得到所需的输出:
# creates a series of weights to be considered and rename it to merge
unique_weights = df['weight'][~df.duplicated(['weight'])]
unique_weights.rename('consider_cum', inplace = True)
# merges the series to the original dataframe and replace the ignored values by 0
df = df.merge(unique_weights.to_frame(), how = 'left', left_index=True, right_index=True)
df.consider_cum = df.consider_cum.fillna(0)
# sums grouping by date and time
df = df.groupby(['date', 'time']).sum().reset_index()
# create the cumulative sum column and present the output
df['weight_cumsum'] = df['consider_cum'].cumsum()
df[['date', 'time', 'weight_cumsum']]
产生以下输出:
我对 python 和 pandas 非常陌生,正在处理看起来像
的 pandas 数据框Date Time ID Weight
Jul-1 12:00 A 10
Jul-1 12:00 B 20
Jul-1 12:00 C 100
Jul-1 12:10 C 100
Jul-1 12:10 D 30
Jul-1 12:20 C 100
Jul-1 12:20 D 30
Jul-1 12:30 A 10
Jul-1 12:40 E 40
Jul-1 12:50 F 50
Jul-1 1:00 A 40
我正在尝试按日期、时间和 ID 进行分组并应用累积和,这样如果下一个时隙中存在 ID,则权重仅添加一次(唯一)。生成的数据框如下所示
Date Time Weight
Jul-1 12:00 130 (10+20+100)
Jul-1 12:10 160 (10+20+100+30)
Jul-1 12:20 160 (10+20+100+30)
Jul-1 12:30 160 (10+20+100+30)
Jul-1 12:40 200 (10+20+100+30+40)
Jul-1 12:50 250 (10+20+100+30+40+50)
Jul-1 01:00 250 (10+20+100+30+40+50)
这是我在下面尝试的方法,但是这仍然多次计算权重:
df=df.groupby(['date','time','ID'])['Wt'].apply(lambda x: x.unique().sum()).reset_index()
df['cumWt']=df['Wt'].cumsum()
非常感谢任何帮助!
提前致谢!!
下面的代码使用 pandas.duplicate(), pandas.merge(), pandas.groupby/sum and pandas.cumsum() 得到所需的输出:
# creates a series of weights to be considered and rename it to merge
unique_weights = df['weight'][~df.duplicated(['weight'])]
unique_weights.rename('consider_cum', inplace = True)
# merges the series to the original dataframe and replace the ignored values by 0
df = df.merge(unique_weights.to_frame(), how = 'left', left_index=True, right_index=True)
df.consider_cum = df.consider_cum.fillna(0)
# sums grouping by date and time
df = df.groupby(['date', 'time']).sum().reset_index()
# create the cumulative sum column and present the output
df['weight_cumsum'] = df['consider_cum'].cumsum()
df[['date', 'time', 'weight_cumsum']]
产生以下输出: