#python #pandas
#python #панды
Вопрос:
Мне нужно вычислить значения Манна-Кендалла для значений осадков по каждому округу в моем наборе данных. Для каждого округа имеется 991 строка. Есть ли способ создать цикл, который принимает каждое название округа (может быть строкой или целым числом) и вычисляет Манна-Кендалла, сохраняя результат в новый файл dataframe / excel?
Так, например, мой фрейм данных выглядит примерно так:
data = pd.DataFrame({'County': ['Adair', 'Adair', 'Adair', 'Allegany', 'Allegany', 'Allegany', 'Alexander', 'Alexander', 'Alexander'], 'Value': [1, 2, 4, 1, 2, -1, 0, 2, 1]})
Мой идеальный результат будет выглядеть так:
Adair: Mann-Kendall Result
Allegany: Mann-Kendall Result
Alexander: Mann-Kendall Result
Код, который у меня есть до сих пор, смущающе прост, но работает не так, как я хочу:
result = pd.DataFrame()
for index in data:
mann = mk.original_test(test1[index])
result.append(mann)
Комментарии:
1. работает ли это:
df_mk=data.groupby('County')['Value'].agg(mk.original_test)
?2. Да, я так считаю! Теперь я чувствую себя очень глупо, что сам об этом не подумал
Ответ №1:
Вы можете вычислить mk для каждого округа, используя group by
:
data = pd.DataFrame({'County': ['Adair', 'Adair', 'Adair', 'Allegany', 'Allegany', 'Allegany', 'Alexander', 'Alexander', 'Alexander'],
'Value': [1, 2, 4, 1, 2, -1, 0, 2, 1]})
df_mk=data.groupby('County')['Value'].agg(mk.original_test).reset_index()
Вы получите именованный кортеж в столбце «Значение», и чтобы получить каждый параметр в отдельный столбец, вы можете сделать следующее:
param_cols='trend h p z Tau s var_s slope intercept'.split()
df_mk[param_cols]=[row for row in df_mk['Value']]