#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 строк