Как заполнить оставшуюся часть дня температурой_мин и температурой_макса того дня, используя панд?

1

У меня есть dataframe, который имеет 4 столбца: день, время, tmin и tmax. tmin показывает температуру_мин дня, а tmax показывает температуру_макс. Я хочу, чтобы уметь заполнять все значения NaN за один день с tmin и tmax того дня. Например, я хочу преобразовать этот файл данных:

   day time     tmin tmax 
0   01 00:00:00 NaN NaN
1   01 03:00:00 -6.8 NaN
2   01 06:00:00 NaN NaN
3   01 09:00:00 NaN NaN
4   01 12:00:00 NaN NaN
5   01 15:00:00 NaN 1.2
6   01 18:00:00 NaN NaN
7   01 21:00:00 NaN NaN
8   02 00:00:00 NaN NaN
9   02 03:00:00 -7.2 NaN
10  02 06:00:00 NaN NaN
11  02 09:00:00 NaN NaN
12  02 12:00:00 NaN NaN
13  02 15:00:00 NaN 1.8
14  02 18:00:00 NaN NaN
15  02 21:00:00 NaN NaN

к этому файлу данных:

       day time     tmin tmax
    0   01 00:00:00 -6.8 1.2
    1   01 03:00:00 -6.8 1.2
    2   01 06:00:00 -6.8 1.2
    3   01 09:00:00 -6.8 1.2
    4   01 12:00:00 -6.8 1.2
    5   01 15:00:00 -6.8 1.2
    6   01 18:00:00 -6.8 1.2
    7   01 21:00:00 -6.8 1.2
    8   02 00:00:00 -7.2 1.8
    9   02 03:00:00 -7.2 1.8
    10  02 06:00:00 -7.2 1.8
    11  02 09:00:00 -7.2 1.8
    12  02 12:00:00 -7.2 1.8
    13  02 15:00:00 -7.2 1.8
    14  02 18:00:00 -7.2 1.8
    15  02 21:00:00 -7.2 1.8
Теги:
pandas

4 ответа

3
Лучший ответ

Использование groupby и transform:

df.assign(**df.groupby('day')[['tmin', 'tmax']].transform('first'))

    day      time  tmin  tmax
0     1  00:00:00  -6.8   1.2
1     1  03:00:00  -6.8   1.2
2     1  06:00:00  -6.8   1.2
3     1  09:00:00  -6.8   1.2
4     1  12:00:00  -6.8   1.2
5     1  15:00:00  -6.8   1.2
6     1  18:00:00  -6.8   1.2
7     1  21:00:00  -6.8   1.2
8     2  00:00:00  -7.2   1.8
9     2  03:00:00  -7.2   1.8
10    2  06:00:00  -7.2   1.8
11    2  09:00:00  -7.2   1.8
12    2  12:00:00  -7.2   1.8
13    2  15:00:00  -7.2   1.8
14    2  18:00:00  -7.2   1.8
15    2  21:00:00  -7.2   1.8

Или, если вы хотите изменить исходный DataFrame вместо возврата копии:

df[['tmin', 'tmax']] = df.groupby('day')[['tmin', 'tmax']].transform('first')
  • 1
    Спасибо user3483203 за ваш ответ. Это именно то, что я искал.
  • 0
    Рад помочь, счастливого программирования!
Показать ещё 2 комментария
1

просто используйте fillna с параметрами форвардной заливки и обратной заливки:

df.tmin = df.groupby('day')['tmin'].fillna(method='ffill').fillna(method='bfill')
df.tmax = df.groupby('day')['tmax'].fillna(method='ffill').fillna(method='bfill')
  • 0
    Я пробовал это, но я хочу точно установить значения tmin и tmax дня 1 в значения NaN дня 1, а также tmin и tmax дня 2 в значения NaN дня 2. Ваш ответ заполняет пробелы tmax и tmin и не учитывает дневные значения. Я прав?
  • 0
    извините за это, сейчас буду редактировать
1

Если вы хотите сделать это не так аккуратно, как это сделал @user3483203!

import pandas as pd
myfile = pd.read_csv('temperature.txt', sep=' ')
mydata = pd.DataFrame(data = myfile)

for i in mydata['day']:
    row_start = (i-1) * 8 # assuming 8 data points per day
    row_end = (i) * 8
    mydata['tmin'][row_start:row_end] = pd.DataFrame.min(tempdata['tmin'][row_start:row_end], skipna=True)
    mydata['tmax'][row_start:row_end] = pd.DataFrame.max(tempdata['tmax'][row_start:row_end], skipna=True)
  • 0
    Благодарю. Это было очень полезно, а также на 99% аккуратно.
0

Поскольку вы не размещали какой-либо код, вот общее решение:

    Step 1: Create variables that will keep track of the min and max temps
    Step 2: Loop through each row in the frame
    Step 3: For each row, check if the min or max == "NaN"
    Step 4: If it is, replace with the value of the min or max variable we created earlier
  • 0
    Спасибо за ваше решение. Так как я могу как-то сделать это чувствительным к номерам дня? Я имею в виду, что Шаг 1 решения должен учитывать числа дней, верно? Я не совсем понимаю эту часть вашего решения.
  • 0
    Например ... создайте переменную с именем "tmin" и установите в 0> цикл по всем значениям для данного дня>, если температура для данного дня не равна NaN и ниже 0, установите tmin в этом>, когда вы достигнете конца данный день, tmin будет содержать самую низкую температуру
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню