Python - Pandalar - Tarih Başına Bir Satırda Tek Değer Girin
Her 24 saatlik aralık için bir sütun oluşturmam gerekiyor, ilk tarih kaydı maksimum değerini içermelidir df.score.
Bu nedenle, yeni sütun yalnızca bir kez daily_max_scoreiçermelidir df.score.max()(ilk günlük kayıtta, genellikle 00:00:00, ancak her zaman o saat ve dakikada değil).
pandaları pd olarak içe aktar
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
İstenen 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
Yanıtlar
İlk olarak, metin tarihi değerlerinizi ile gerçek tarih zamanlarına dönüştürün df['date'] = pd.to_datetime(df['date']).
Ardından tarihleri üzerinden gruplandırın df.groupby(df['date'].dt.date).
Her tarih için maksimum günlük puanı alın, önce maksimum değeri elde etmek için metin değerlerini tam sayılara çevirin (maksimum lex sıralı değere kıyasla). Sonucu bir dizeye geri dönüştürün.
Her tarih için minimum tarih saatinin dizin konumunu kullanarak günlük maksimum puanların bir veri çerçevesi oluşturun, yani index=gb['date'].idxmin().
Dizine alınan bu veri çerçevesi daily_max_scoreartık orijinal veri çerçevesine (varsayılan olarak dizine katılan) birleştirilerek istenen sonucu elde edilebilir.
Hem ve scorehem daily_max_scorede hala dizeler (yani nesneler) olduğuna dikkat edin; bu, başlangıçta nasıl atandıkları ve dolayısıyla istenen tür oldukları sonucuna varılmıştır.
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