Heim  >  Artikel  >  Backend-Entwicklung  >  Bedingte Zusammenführung mit Pandas

Bedingte Zusammenführung mit Pandas

WBOY
WBOYnach vorne
2024-02-22 13:07:091208Durchsuche

Bedingte Zusammenführung mit Pandas

Frageninhalt

Ich habe einen Pandas-Datenrahmen wie unten, der andere Anrufe in eine Region detailliert beschreibt:

commsdate Bereich day0 inkrementell Tag1 inkrementell Tag2 inkrementell
24.01.01 Verkauf 43 36 29
24.01.01 Service 85 74 66
24.01.02 Verkauf 56 42 31
24.01.02 Service 73 62 49
24.01.03 Verkauf 48 32 24
24.01.03 Service 67 58 46

Ich versuche, die Anzahl der eingegangenen Anrufe nach Datum zu berechnen. Die am 1. Januar eingegangenen Verkaufsanrufe sind also day0_incremental (43) dieses Datums, der 2. Januar ist day0 des 2. Januar plus 1. Januar, Tag1 (36+) 56) und der 3. Januar ist Tag0 des 3. Januar plus Tag1 des 2. Januar, Tag2 des 1. Januar (48+42+29), was den folgenden Datenrahmen ergibt:

Anrufdatum Verkauf Service
24.01.01 43 85
24.01.02 92 147
24.01.03 119 195
01.04.24 63 107
01.05.24 24 46

Ich habe erfolgreich eine Shell des Datenrahmens für die zweite Tabelle erstellt, ohne Werte unter der Bereichsspalte, weiß aber nicht, was ich als Nächstes tun soll:

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]

Ich habe angefangen, eine for-Schleife zu schreiben, bin aber nur so weit gekommen:

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

Richtige Antwort


Du kannst anrufenpivotshiftadd:

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

Alternativ verwenden Sie von 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)

Ausgabe:

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

Das obige ist der detaillierte Inhalt vonBedingte Zusammenführung mit Pandas. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen