我有一個 pandas 資料框,如下所示,其中詳細說明了對某個區域的其他呼叫:
commsdate | area | day0 incremental | day1 incremental | day2 incremental |
---|---|---|---|---|
01/01/24 | sales | 43 | 36 | 29 |
01/01/24 | service | 85 | 74 | 66 |
02/01/24 | sales | 56 | 42 | 31 |
02/01/24 | service | 73 | 62 | 49 |
03/01/24 | sales | 48 | 32 | 24 |
03/01/24 | service | 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),產生以下資料框:
CallDate | Sales | Service |
---|---|---|
01/01/24 | 43 | 85 |
02/01/24 | 92 | 147 |
03/01/24 | 119 | 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) =
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) )###或者,使用從 ###dayx …### 字串中提取的數字以程式設計方式使用 ######functools.reduce#####:###
from functools import reduce import re reg = re.compile(r'day(\d+)') df['commsdate'] = pd.to_datetime(df['commsdate'], dayfirst=true) tmp = df.pivot(index='commsdate', columns='area') out = reduce(lambda a,b: a.add(b, fill_value=0), (tmp[d].shift(freq=f'{reg.search(d).group(1)}d') for d in tmp.columns.get_level_values(0).unique()) ).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
以上是與pandas有條件合併的詳細內容。更多資訊請關注PHP中文網其他相關文章!