Существует ли функция pandas для получения среднего значения заданного диапазона ячеек?

#python #pandas

#python #pandas

Вопрос:

Я уменьшаю шум в наборе данных pointcloud из многолучевого сканирования, набор данных, над которым я сейчас работаю, содержит 87295 строк.
Я хочу получить среднее значение (или стандартное отклонение) диапазона ячеек. Каждый диапазон ячеек составляет 1% от всего фрейма данных.

Прошло некоторое время с тех пор, как я использовал Python / Pandas, но это то, что я придумал

 amount_of_rows = df['X'].count()
percentage = 0.01 
row1 = int(amount_of_rows * percentage) 
row2 = int(amount_of_rows * (percentage * 2))
row3 = int(amount_of_rows * (percentage * 3))
row4...
row5....
  

Это продолжается для 100 строк.

 row1 = 872
row2 = 1745
  

Итак, тогда я бы использовал эти строки, чтобы получить среднее значение между ними следующим образом.

 rowmean1 = df[row1:row2].mean()
rowmean2 = df[row2:row3].mean()
rowmean3 = df[row3:row4].mean()
rowmean4...
rowmean5...
  

Затем я бы использовал их rowmeans для фильтрации данных на основе значения в том же диапазоне.
Итак rowmean1 , среднее значение всех значений между 872 и 1745

Но прежде чем я это сделаю, я хотел бы знать, есть ли лучший способ сделать это? Без копирования моего кода 100 раз? Я пробовал писать разные функции и циклы, чтобы сделать это самостоятельно, но ничего не дало желаемого результата.

пример df

           X          Y     Z

1   100980.05  498385.17 -9.15
2   100980.08  498385.13 -9.14
3   100980.11  498385.08 -9.13
4   100980.13  498385.04 -9.12
5   100980.16  498384.99 -9.11
6   100980.19  498384.95 -9.10
7   100980.26  498384.84 -8.56
8   100980.24  498384.86 -9.08
9   100980.28  498384.79 -8.86
10  100980.30  498384.77 -9.06
11  100980.32  498384.73 -9.05
12  100980.35  498384.68 -9.04
13  100980.38  498384.64 -9.03
14  100980.40  498384.59 -9.02
15  100980.43  498384.55 -9.01
16  100980.46  498384.51 -8.99
17  100980.48  498384.47 -8.98
18  100980.51  498384.42 -8.97
19  100980.54  498384.38 -8.96
20  100980.56  498384.34 -8.95
21  100980.59  498384.29 -8.94
22  100980.62  498384.25 -8.92
23  100980.64  498384.21 -8.91
24  100980.67  498384.17 -8.90
25  100980.69  498384.12 -8.89
26  100980.73  498384.07 -8.58
27  100980.75  498384.04 -8.87
28  100980.77  498384.00 -8.86
29  100980.80  498383.96 -8.85
30  100980.82  498383.91 -8.84
  

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

1. разве это не df.loc[index1:index2].mean() ?

2. @tgrandje что вы имеете в виду? (ха-ха) что я должен использовать df.iloc?

3. Нет, я имел в виду, что df[x] — это способ захвата столбцов, а не строк (?)

4. @tgrandje Я понимаю, df['X'].count часть такова, что я получаю одно значение, потому что, если я использую df.count, я получаю подсчеты для всех столбцов. Которые одинаковы для всех из них

5. pandas.rolling.mean

Ответ №1:

Редактировать

 import numpy as np
import pandas as pd

df = pd.DataFrame(...)
df["percentage"] = 1/len(df)
df['cum'] = df['percentage'].cumsum()

for val in np.arange(0.01, 1.01, .01):
  precedent = val - .01
  ix = df[(precedent < df['cum']) amp; (df['cum'] <= val)].index
  this_mean = df.loc[ix, 'X'].mean()
  print(min(ix), '->', max(ix), ':', this_mean)
  

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

1. Спасибо! выглядит многообещающе, я посмотрю на это завтра 🙂

2. поэтому, когда я использую это, я получаю ошибку индекса. Также, когда я просто печатаю rows , я получаю только одно число, повторяющееся все время

3. можете ли вы опубликовать образец вашего исходного фрейма данных? (что-то вроде df.head().to_dict())

4. В понимании списка была опечатка в отношении счетчика, извините за это

5. я получил первые 30 строк