Вычисление Манна-Кендалла путем перебора нескольких строк

#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']]