首頁  >  文章  >  後端開發  >  與pandas有條件合併

與pandas有條件合併

WBOY
WBOY轉載
2024-02-22 13:07:091208瀏覽

與pandas有條件合併

問題內容

我有一個 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) =

正確答案


您可以撥打#pivotshift

######## #和######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)
      )
###或者,使用從 ###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中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除