与pandas有条件合并

问题描述 投票:0回答:1

我有一个 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) = 
python pandas dataframe
1个回答
0
投票

您可以

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
© www.soinside.com 2019 - 2024. All rights reserved.