Python - Pandalar - Tarih Başına Bir Satırda Tek Değer Girin

Oct 09 2020

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

1 Alexander Oct 09 2020 at 02:40

İ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