Python - Pandas - Fügen Sie einen einzelnen Wert in eine Zeile pro Datum ein
Ich muss eine Spalte erstellen. Für jedes 24-Stunden-Intervall sollte der erste Datumsdatensatz den Maximalwert von enthalten df.score.
Die neue Spalte daily_max_scoresollte also df.score.max()nur einmal enthalten (bei der ersten täglichen Aufzeichnung normalerweise um 00:00:00 Uhr, aber nicht immer zu dieser Stunde und Minute).
Pandas als pd importieren
df = pd.DataFrame({
'date': ['2019-04-19 23:00:00','2019-04-20 00:00:00','2019-04-20 01:00:00', '2019-04-05 08:00:00',
'2019-07-31 23:30:00','2019-08-01 00:00:00','2019-08-01 01:00:00', '2019-08-01 02:00:00'],
'ID': ['ID F', 'ID F', 'ID F', 'ID F',
'ID B', 'ID B', 'ID B', 'ID B'],
'score': ['50', '100', '99', '99',
'75', '25', '25', '80']})
df['date'] = pd.to_datetime(df['date'], infer_datetime_format=True)
df
date ID score
0 2019-04-19 23:00:00 ID F 50
1 2019-04-20 00:00:00 ID F 100
2 2019-04-20 01:00:00 ID F 99
3 2019-04-05 08:00:00 ID F 99
4 2019-07-31 23:30:00 ID B 75
5 2019-08-01 00:00:00 ID B 25
6 2019-08-01 01:00:00 ID B 25
7 2019-08-01 02:00:00 ID B 80
Gewünschter DataFrame:
date ID score daily_max_score
0 2019-04-19 23:00:00 ID F 50 50
1 2019-04-20 00:00:00 ID F 100 100
2 2019-04-20 01:00:00 ID F 99 NaN
3 2019-04-05 08:00:00 ID F 99 99
4 2019-07-31 23:30:00 ID B 75 75
5 2019-08-01 00:00:00 ID B 25 80
6 2019-08-01 01:00:00 ID B 25 NaN
7 2019-08-01 02:00:00 ID B 80 NaN
Antworten
Konvertieren Sie zunächst Ihre Textdatumswerte in tatsächliche Datumszeiten über df['date'] = pd.to_datetime(df['date']).
Dann gruppieren Sie die Daten über df.groupby(df['date'].dt.date).
Ermitteln Sie die maximale Tagespunktzahl für jedes Datum und konvertieren Sie zuerst die Textwerte in Ganzzahlen, um den Maximalwert (im Vergleich zum sortierten Maximal-Lex-Wert) zu erhalten. Konvertieren Sie das Ergebnis zurück in eine Zeichenfolge.
Erstellen Sie einen Datenrahmen mit den täglichen Maximalwerten, indem Sie die Indexposition der minimalen Datums- und Uhrzeitangabe für jedes Datum verwenden, d index=gb['date'].idxmin(). H.
Dieser Datenrahmen des indizierten Datenrahmens daily_max_scorekann jetzt mit dem ursprünglichen Datenrahmen (der standardmäßig mit dem Index verknüpft wird) verknüpft werden, wodurch das gewünschte Ergebnis erzielt wird.
Beachten Sie, dass sowohl die scoreals daily_max_scoreauch noch Zeichenfolgen (dh Objekte) sind. Auf diese Weise wurden sie ursprünglich zugewiesen und daher als der gewünschte Typ abgeleitet.
df['date'] = pd.to_datetime(df['date'])
gb = df.groupby(df['date'].dt.date)
max_daily_scores = gb['score'].apply(lambda x: x.astype(int).max()).astype(str)
daily_max_score = pd.DataFrame(
max_daily_scores.tolist(),
index=gb['date'].idxmin(),
columns=['daily_max_score']
)
>>> df.join(daily_max_score)
date ID score daily_max_score
0 2019-04-19 23:00:00 ID F 50 50
1 2019-04-20 00:00:00 ID F 100 100
2 2019-04-20 01:00:00 ID F 99 NaN
3 2019-04-05 08:00:00 ID F 99 99
4 2019-07-31 23:30:00 ID B 75 75
5 2019-08-01 00:00:00 ID B 25 80
6 2019-08-01 01:00:00 ID B 25 NaN
7 2019-08-01 02:00:00 ID B 80 NaN