Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Gabungan bersyarat dengan panda

Gabungan bersyarat dengan panda

WBOY
WBOYke hadapan
2024-02-22 13:07:091206semak imbas

Gabungan bersyarat dengan panda

Kandungan soalan

Saya mempunyai bingkai data panda seperti di bawah yang memperincikan panggilan lain ke rantau:

commsdate kawasan hari0 kenaikan hari1 kenaikan hari2 incremental
01/01/24 jualan 43 36 29
01/01/24 perkhidmatan 85 74 66
02/01/24 jualan 56 42 31
02/01/24 perkhidmatan 73 62 49
03/01/24 jualan 48 32 24
03/01/24 perkhidmatan 67 58 46

Saya cuba mengira bilangan panggilan yang diterima mengikut tarikh, jadi panggilan jualan yang diterima pada 1 Januari akan menjadi hari0_incremental (43) tarikh tersebut dan 2 Januari ialah hari0 2 Januari ditambah 1 Januari hari1 (36+) 56 ) dan 3 Januari akan menjadi hari0 3 Januari ditambah hari1 2 Januari hari2 1 Januari (48+42+29), menghasilkan bingkai data berikut :

CallDate Jualan Perkhidmatan
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

Saya telah berjaya mencipta cangkerang bingkai data untuk jadual kedua, tanpa nilai di bawah lajur kawasan, tetapi tidak tahu apa yang perlu dilakukan seterusnya:

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]

Saya telah mula menulis gelung untuk, tetapi saya hanya mendapat setakat ini:

for i in range(1,len(areaunique)+1):
    dfnew.columns(i) =

Jawapan betul


Anda boleh hubungipivotshiftadd:

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)
      )

Sebagai alternatif, gunakan daripada 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)

Keluaran:

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

Atas ialah kandungan terperinci Gabungan bersyarat dengan panda. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam