Python - Pandas - Fügen Sie einen einzelnen Wert in eine Zeile pro Datum ein

Oct 09 2020

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

1 Alexander Oct 09 2020 at 02:40

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