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

Fusion conditionnelle avec les pandas

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Libérer: 2024-02-22 13:07:09
avant
1307 Les gens l'ont consulté

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]
Copier après la connexion

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) =
Copier après la connexion


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)
      )
Copier après la connexion

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)
Copier après la connexion

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
Copier après la connexion

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 de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal