#python #pandas #dataframe #data-science
#python #pandas #фрейм данных #наука о данных
Вопрос:
У меня есть несколько столбцов x amp; y в фрейме данных, таких как показано ниже:
X-1 X-1_y X-2 X-2_y X-3 X-3_y
0 411.726266 1387.29 437.404307 3755.08 437.273585 3360.85
1 437.692665 677.39 448.557534 1460.70 448.760155 981.45
2 448.596937 2276.35 481.550490 0.00 481.566018 0.00
3 481.634531 0.00 486.966310 0.00 487.208899 0.00
4 486.971163 0.00 492.578155 0.00 492.446192 0.00
5 492.505388 0.00 500.000000 608.22 500.153040 0.00
6 500.030500 810.45 508.218825 0.00 508.315935 0.00
7 508.106596 0.00 513.579177 0.00 513.620953 9582.45
8 513.424161 0.00 515.308245 0.00 515.175867 0.00
9 535.131828 0.00 534.346333 0.00 534.985459 0.00
10 551.779516 3124.92 551.712654 2226.94 551.680943 2522.73
11 559.050425 1081.89 559.084859 984.05 559.087271 1600.48
12 562.108257 3532.11 562.253910 3686.94 562.234223 4495.73
13 591.436797 0.00 590.659433 0.00 591.396752 0.00
и я хотел бы выровнять все 3 X столбца и объединить их в 1 X столбец. если числа в столбцах X расположены слишком близко друг к другу (т. Е. — 1), получите среднее значение из трех, если доступно, но если числа не близки друг к другу, добавьте новую строку, чтобы конечным результатом был новый фрейм данных, подобный этому :
avg X X-1_y X-2_y X-3_y
0 411.726266 1387.29 0.00 0.00
1 437.456852 677.39 3755.08 3360.85
2 448.638209 2276.35 1460.70 981.45
3 481.583680 0.00 0.00 0.00
4 487.048791 0.00 0.00 0.00
5 492.509912 0.00 0.00 0.00
6 500.061180 810.45 608.22 0.00
7 508.213785 0.00 0.00 0.00
8 513.541430 0.00 0.00 9582.45
9 515.242056 0.00 0.00 0.00
10 534.821206 0.00 0.00 0.00
11 551.724371 3124.92 2226.94 2522.73
12 559.074185 1081.89 984.05 1600.48
13 562.198797 3532.11 3686.94 4495.73
14 591.164327 0.00 0.00 0.00
пример того, как создается результат:
если числа в строке X равны — 1, то получите среднее значение, если все 3 не находятся в пределах -1, то добавьте три новые строки, но если 1 не находится в пределах двух других, то добавьте 2 строки (1 — это новое значение off, а 2 — е — среднее значение 2 других, которые находятся в пределах -1). например, в первой строке данных,
X-1 X-1_y X-2 X-2_y X-3 X-3_y
0 411.726266 1387.29 437.404307 3755.08 437.273585 3360.85
1 437.692665 677.39 448.557534 1460.70 448.760155 981.45
X1 (411.72) не находится в пределах -1 от X2 (437.4) и X3 (437.2), поэтому в результате будет добавлена новая строка, но X2 (437.4) и X3 (437.2) находятся в пределах -1 друг от друга, а также в пределах -1 от 2-й строки X1 (437.692), поэтому добавьте среднее значение из 3 в следующей строке среднее значение (X1_row2, X2_row1 , X3_row1)
результаты будут
avg X X-1_y X-2_y X-3_y
0 411.726266 1387.29 0.00 0.00
1 437.456852 677.39 3755.08 3360.85
заранее спасибо
Комментарии:
1. Пожалуйста, объясните немного больше о том, как генерируется результат. Вы говорите, что если числа в строке X равны -1, то получите среднее значение, если нет, добавьте все 3 в новые строки?
2. Спасибо @BillyBonaros. да, это почти правильно. Я попытался объяснить это на примере в вопросе, поскольку ответ был немного длинным для комментария .
3. Я просто отвечаю, к вашему сведению, вы пропустили одно значение в желаемом выводе;)
Ответ №1:
Вы можете сделать следующее:
Сначала мы хотим составить плоский список всех значений:
x=list(df["X-1"]) list(df["X-2"]) list(df["X-3"])
items=[[row["X-1"]] [row["X-2"]] [row["X-3"]] for index,row in df.iterrows()]
flat_list = [item for sublist in items for item in sublist]
Затем:
final=[]
x=0
while x<len(flat_list):
try:
if (abs(flat_list[x:x 3][0]-flat_list[x:x 3][1])<1)amp;(abs(flat_list[x:x 3][0]-flat_list[x:x 3][2])<1):
final.append(sum(flat_list[x:x 3])/3)
x =3
else:
final.append(flat_list[x])
x =1
except:
final.append(flat_list(x))
и это даст то, что вы хотите для столбца avg_X:
final
[411.726266,
437.4568523333333,
448.6382086666667,
481.5836796666667,
487.04879066666666,
492.5099116666667,
500.06118,
508.21378533333336,
513.5414303333333,
515.308245,
515.175867,
534.8212066666666,
551.7243709999999,
559.0741849999999,
562.1987966666667,
591.1643273333334]
Комментарии:
1. Спасибо @Billy Bonaros. Я думаю, это работает. Как я могу выровнять свои столбцы y с этим? X-1_y X-2_y X-3_y
2. В нем может быть больше или меньше строк, чем в текущем фрейме данных. Вы можете попробовать добавить его как новый столбец: df[«avg_X»]=final, но опять же, он может иметь неправильную форму