Heim > Artikel > Backend-Entwicklung > Bedingte Zusammenführung mit Pandas
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) =
Du kannst anrufenpivot
、shift
和add
:
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!