Heim > Backend-Entwicklung > Python-Tutorial > Bedingte Zusammenführung mit Pandas

Bedingte Zusammenführung mit Pandas

WBOY
Freigeben: 2024-02-22 13:07:09
nach vorne
1247 Leute haben es durchsucht

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]
Nach dem Login kopieren

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) =
Nach dem Login kopieren


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)
      )
Nach dem Login kopieren

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)
Nach dem Login kopieren

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
Nach dem Login kopieren

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!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage