Maison >développement back-end >Tutoriel Python >Fusion conditionnelle avec les pandas

Fusion conditionnelle avec les pandas

WBOY
WBOYavant
2024-02-22 13:07:091220parcourir

Fusion conditionnelle avec les pandas

Contenu de la question

J'ai un dataframe pandas comme ci-dessous qui détaille d'autres appels vers une région :

date de communication zone jour0 incrémentiel jour1 incrémentiel jour2 incrémentiel
01/01/24 ventes 43 36 29
01/01/24 service 85 74 66
02/01/24 ventes 56 42 31
02/01/24 service 73 62 49
03/01/24 ventes 48 32 24
03/01/24 service 67 58 46

J'essaie de calculer le nombre d'appels reçus par date, donc un appel commercial reçu le 1er janvier sera le jour0_incremental (43) de cette date et le 2 janvier sera le jour0 du 2 janvier plus le 1er janvier jour1 (36+) 56 ) et le 3 janvier sera le jour0 du 3 janvier plus le jour1 du 2 janvier plus le jour2 du 1er janvier (48+42+29), ce qui donnera le bloc de données suivant :

Date d'appel Ventes 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

J'ai réussi à créer un shell du dataframe pour la deuxième table, sans valeurs sous la colonne zone, mais je ne sais pas quoi faire ensuite :

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]

J'ai commencé à écrire une boucle for, mais je n'y suis arrivé que jusqu'ici :

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

Bonne réponse


Vous pouvez appelerpivotshiftadd :

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

Vous pouvez également utiliser à partir de 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)

Sortie :

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer