我有一个包含历史记录的数据框,例如sales。
import pandas as pd
first_salesman = pd.Series([1, 2, 3], index=[pd.to_datetime('2015-01-01'), pd.to_datetime('2015-01-02'), pd.to_datetime('2015-01-03')])
second_salesman = pd.Series([2, 0, 5], index=[pd.to_datetime('2015-01-01'), pd.to_datetime('2015-01-02'), pd.to_datetime('2015-01-03')])
third_salesman = pd.Series([6, 7, 1], index=[pd.to_datetime('2015-01-01'), pd.to_datetime('2015-01-02'), pd.to_datetime('2015-01-03')])
df = pd.concat([first_salesman, second_salesman, third_salesman], axis=1).reset_index()
df = pd.melt(df, id_vars=['index'], value_vars=[0, 1, 2])
df.columns = ['Date', 'Salesman_id', 'Sales']
df = df.set_index('Date')
我想计算每个销售人员的历史统计数据:换句话说,对于每个销售人员和每一天,我想知道他们的平均值,标准,最大值,最小值等等,直到那个一天。
因此专注于推销员1而只关注平均值,它将是[1,1.5,2]。
我当然可以构建一个for循环,但是我有相当多的销售人员和日期,这看起来不是最有效的事情。我正在寻找的是一种以有效的方式计算它的方法。
答案 0 :(得分:0)
经过一些修补,我找到了解决方案。在Pandas> = 0.18中,您可以使用df.expanding()。请参阅documentation。
这个场景的一个干净的解决方案是这个单线程:
df.set_index(['Salesman_id', 'Date']).expanding(min_periods=1).agg([np.mean, np.std, np.min, np.max])
请注意.expanding()完全支持.agg(),因此您可以使用您想要的任何聚合。