Как выполнить скользящий расчет на основе подмножеств строк

#pandas #rolling-computation

#pandas #скользящее вычисление

Вопрос:

Я выполняю скользящий анализ среднего значения в фрейме данных pandas,

 R1_Chr_Name distance    count
0   chr1    100 163
1   chr1    101 203
2   chr1    102 194
3   chr1    103 193
4   chr1    104 154
5   chr2    100 150
6   chr2    101 152
7   chr2    102 163
8   chr2    103 161
9   chr2    104 170
10  chr3    100 154
11  chr3    101 160
12  chr3    102 175
13  chr3    103 134
14  chr3    104 151
  

Я хочу добавить столбец с именем ‘average_count’, который будет выполнять скользящее среднее значение внутри подгруппы строк, например, выполнять скользящее среднее значение ‘count’, когда столбец ‘R1_Chr_Name’ равен chr1, chr2, ch3 …,
Требуемый результат должен выглядеть следующим образом:

 R1_Chr_Name distance    count   average_count
0   chr1    100 163 NaN
1   chr1    101 203 NaN
2   chr1    102 194 186.666667
3   chr1    103 193 196.666667
4   chr1    104 154 180.333333
5   chr2    100 150 NaN
6   chr2    101 152 NaN
7   chr2    102 163 155.000000
8   chr2    103 161 158.666667
9   chr2    104 170 164.666667
10  chr3    100 154 NaN
11  chr3    101 160 NaN
12  chr3    102 175 163.000000
13  chr3    103 134 156.333333
14  chr3    104 151 153.333333
  

В настоящее время я использую следующий код и обнаружил, что предыдущие вычисления были перезаписаны:

 chr_ls = ['chr1', 'chr2', 'chr3']
for chrom in chr_ls:
    df['average_count']=df[df['R1_Chr_Name']==chrom]['count'].rolling(3).mean()
    print(df)

R1_Chr_Name  distance  count  average_count
0         chr1       100    163            NaN
1         chr1       101    203            NaN
2         chr1       102    194            NaN
3         chr1       103    193            NaN
4         chr1       104    154            NaN
5         chr2       100    150            NaN
6         chr2       101    152            NaN
7         chr2       102    163            NaN
8         chr2       103    161            NaN
9         chr2       104    170            NaN
10        chr3       100    154            NaN
11        chr3       101    160            NaN
12        chr3       102    175     163.000000
13        chr3       103    134     156.333333
14        chr3       104    151     153.333333
  

Итак, как это сделать правильно?

Ответ №1:

Проверьте с groupby

 df['ave_count']=df.groupby('R1_Chr_Name')['count'].rolling(3).mean().reset_index(level=0,drop=True)
df
Out[232]: 
   R1_Chr_Name  distance  count   ave_count
0         chr1       100    163         NaN
1         chr1       101    203         NaN
2         chr1       102    194  186.666667
3         chr1       103    193  196.666667
4         chr1       104    154  180.333333
5         chr2       100    150         NaN
6         chr2       101    152         NaN
7         chr2       102    163  155.000000
8         chr2       103    161  158.666667
9         chr2       104    170  164.666667
10        chr3       100    154         NaN
11        chr3       101    160         NaN
12        chr3       102    175  163.000000
13        chr3       103    134  156.333333
14        chr3       104    151  153.333333
  

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

1. Большое спасибо. Я уверен, что работает. Я действительно смущен тем, как работает метод reset_index (), count (). Требуется дополнительное исследование.