我有一个 pandas 数据框,如下所示,其中详细说明了对某个区域的其他调用:
通讯日期 | 面积 | 第0天增量 | 第 1 天增量 | 第2天增量 |
---|---|---|---|---|
01/01/24 | 销售 | 43 | 36 | 29 |
01/01/24 | 服务 | 85 | 74 | 66 |
02/01/24 | 销售 | 56 | 42 | 31 |
02/01/24 | 服务 | 73 | 62 | 49 |
03/01/24 | 销售 | 48 | 32 | 24 |
03/01/24 | 服务 | 67 | 58 | 46 |
我正在尝试按日期计算收到的电话数量,因此 1 月 1 日收到的销售电话将是该日期的 Day0_incremental (43),1 月 2 日将是 1 月 2 日的 Day0 加 1 月 1 日的 Day1 (36+56) 1 月 3 日将是 1 月 3 日的 Day0 加上 1 月 2 日的 Day1 加上 1 月 1 日的 Day2 (48+42+29),从而产生以下数据框:
通话日期 | 销售 | 服务 |
---|---|---|
01/01/24 | 43 | 85 |
02/01/24 | 92 | 147 |
03/01/24 | 112 | 195 |
04/01/24 | 63 | 107 |
05/01/24 | 24 | 46 |
我已经成功地为第二个表创建了一个数据框的外壳,在区域列下没有值,但对接下来的步骤一无所知:
df['CommsDate'] = pd.to_datetime(df['CommsDate'], format='%d/%m/%Y')
areaUnique = df['Area'].unique().tolist()
from datetime import timedelta
CallDate = pd.date_range(start=min(df['CommsDate']), end=max(df['CommsDate'])+timedelta(days=6), freq='D')
data = {area: [] for area in areaUnique}
dfNew = pd.DataFrame(data)
dfNew['CallDate'] = CallDate
dfNew = dfNew.melt(id_vars=['CallDate'], var_name='Area')
dfNew = dfNew.pivot(index='CallDate', columns='Area', values='value')
dfNew = dfNew.reset_index()
dfNew = dfNew[['CallDate'] + areaUnique]
我已经开始编写一个 for 循环,但我只做到了这一点:
for i in range(1,len(areaUnique)+1):
dfNew.columns(i) =
您可以
pivot
、shift
和add
:
df['CommsDate'] = pd.to_datetime(df['CommsDate'], dayfirst=True)
tmp = df.pivot(index='CommsDate', columns='Area')
out = (tmp['Day0 Incremental']
.add(tmp['Day1 Incremental'].shift(freq='1d'), fill_value=0)
.add(tmp['Day2 Incremental'].shift(freq='2d'), fill_value=0)
.reset_index().rename_axis(columns=None)
)
输出:
CommsDate Sales Service
0 2024-01-01 43.0 85.0
1 2024-01-02 92.0 147.0
2 2024-01-03 119.0 195.0
3 2024-01-04 63.0 107.0
4 2024-01-05 24.0 46.0