Как я могу использовать функцию zip в Python и возвращать индекс ряда, содержащего максимальное значение?

#python #pandas #series

#python #pandas #Серии

Вопрос:

Я использую zip для сравнения двух серий Max_Plot2015_serie, Max_Plot2005_2014_serie и возврата максимального значения из двух в новую серию Max_scatter2015[‘Temp_Celsius’]. Как я могу также импортировать индекс соответствующего значения (индекс — это дата)? Я новичок в Python и плохо осваиваю функции

 Max_scatter2015['Temp_Celcius'] = [max(value) for value in zip(Max_Plot2015_serie, Max_Plot2005_2014_serie)]

Max_Plot2005_2014_serie
2014-12-25    10.0
2014-12-26    10.0
2014-12-27    11.1
2014-12-28    13.3
2014-12-30     3.3
2014-12-31    -2.8
Name: Temp_Celcius, dtype: float64
<class 'pandas.core.series.Series'>


Max_Plot2015_serie
2015-10-02    18.9
2015-03-10     9.4
2015-02-23    -1.1
2015-06-09    25.6
Name: Temp_Celcius, dtype: float64
<class 'pandas.core.series.Series'>

Max_scatter2015
Temp_Celcius    [18.9, 13.9, 26.1, 23.3, 6.7, 18.3, 27.8, 7.2,...
dtype: object
<class 'pandas.core.series.Series'>
  

Комментарии:

1. Извините, я не могу понять, чего вы хотите. Внизу, где вы показываете Max_scatter2015 , это тот результат, который вы хотите? или результат, который вы получаете? Вы пытаетесь, например, сравнить температуры для одного и того же дня года в разные годы?

2. попробуйте np.where для сравнения.

Ответ №1:

IIUC, вы можете попробовать что-то вроде этого:

 s_2014 = pd.Series(np.random.randint(0,120,365), 
                   index=pd.date_range('2014-01-01', periods=365, freq='D'))

s_2015 = pd.Series(np.random.randint(0,135, 365), 
                   index=pd.date_range('2015-01-01', periods=365, freq='D'))
  

Найдите максимальные значения по дням:

 m = [max(i, j, key=lambda x: x[1]) for i, j in zip(s_2014.iteritems(), s_2015.iteritems())]
j, i = zip(*m)
s = pd.Series(i, index=j)
s
  

Вывод:

 2015-01-01    104
2014-01-02    101
2014-01-03    118
2014-01-04     26
2015-01-05     98
             ... 
2015-12-27    132
2014-12-28     58
2015-12-29    110
2015-12-30    115
2015-12-31     35
Length: 365, dtype: int64
  

Обновите только данные за 2015 год:

 s[s.index.year == 2015]
  

Вывод:

 2015-01-01     60
2015-01-03    109
2015-01-06     71
2015-01-07    113
2015-01-09      9
             ... 
2015-12-16     90
2015-12-23     98
2015-12-26    132
2015-12-27    107
2015-12-29     65
Length: 204, dtype: int64
  

Комментарии:

1. Спасибо, ваше решение работает нормально, но я хотел бы иметь только данные за 2015 год, как можно настроить решение для получения этой новой серии?

Ответ №2:

Может быть, это то, что вы ищете:

 df = pandas.DataFrame([])
df["Max_Plot2015_serie"] = Max_Plot2015_serie
df["Max_Plot2005_2014_serie"] = Max_Plot2005_2014_serie

df["max_value"] = df.apply(lambda x: max(x.Max_Plot2015_serie, x.Max_Plot2005_2014_serie), axis=1)
df["max_index"] =  df.apply(lambda x: (0 if x.Max_Plot2015_serie > x.Max_Plot2005_2014_serie else 1), axis=1)