Rumah > pembangunan bahagian belakang > Tutorial Python > Gabungan bersyarat dengan panda

Gabungan bersyarat dengan panda

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Lepaskan: 2024-02-22 13:07:09
ke hadapan
1301 orang telah melayarinya

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]
Salin selepas log masuk

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

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


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)
      )
Salin selepas log masuk

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)
Salin selepas log masuk

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
Salin selepas log masuk

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

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan