среднее значение по сегментам фрейма данных

#pandas #dataframe #average #segment

Вопрос:

На следующем рисунке у меня есть фрейм данных, который отображает ноль после каждого цикла работы (цикл имеет случайную длину). Я хочу рассчитать среднее значение (или выполнить другие операции) для каждого патча. Например, среднее значение [0.762, 0.766] одиночества, [0.66, 1.37, 2.11, 2.29] одиночества и так далее до конца кадра данных.

введите описание изображения здесь

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

1. Пожалуйста, отредактируйте вопрос, чтобы ограничить его конкретной проблемой с достаточной детализацией для определения адекватного ответа.

Ответ №1:

Поэтому я работал с этими данными :

     random_value
0   0
1   0
2   1
3   2
4   3
5   0
6   4
7   4
8   0
9   1
 

Вероятно, есть лучшее решение, но вот с чем я пришел :

 def avg_function(df):
    avg_list = []
    value_list = list(df["random_value"])
    temp_list = []
    for i in range(len(value_list)):
        if value_list[i] == 0:
            if temp_list:
                avg_list.append(sum(temp_list) / len(temp_list))
                temp_list = []
        else:
            temp_list.append(value_list[i])
    if temp_list:  # for the last values
        avg_list.append(sum(temp_list) / len(temp_list))
    return avg_list

test_list = avg_function(df=df)
test_list

[Out] : [2.0, 4.0, 1.0]
 

Изменить: поскольку запрошено в комментариях, вот способ добавить средства в фрейм данных. Я не знаю, есть ли способ сделать это с пандами (и может быть!), Но я придумал это :

 def add_mean(df, mean_list):
    temp_mean_list = []
    list_index = 0  # will be the index for the value of mean_list

    df["random_value_shifted"] = df["random_value"].shift(1).fillna(0)
    random_value = list(df["random_value"])
    random_value_shifted = list(df["random_value_shifted"])
   

    for i in range(df.shape[0]):
        if random_value[i] == 0 and random_value_shifted[i] == 0:
            temp_mean_list.append(0)
        elif random_value[i] == 0 and random_value_shifted[i] != 0:
            temp_mean_list.append(0)
            list_index  = 1
        else:
            temp_mean_list.append(mean_list[list_index])
    df = df.drop(["random_value_shifted"], axis=1)
    df["mean"] = temp_mean_list
    return df

df = add_mean(df=df, mean_list=mean_list
 

Что дало мне :

 df

[Out] :
    random_value    mean
0   0               0
1   0               0
2   1               2
3   2               2
4   3               2
5   0               0
6   4               4
7   4               4
8   0               0
9   1               1
 

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

1. это действительно полезно, было бы излишне с моей стороны задавать дополнительные вопросы. Я хочу добавить эти окончательные результаты в столбец во фрейме данных, но с той же индексацией данных. Например, [2.0] , среднее значение которого составляет 1,2,3 в столбце случайных значений, будет иметь индекс 2,3,4.