Как выровнять 3 фрейма данных с некоторым порогом в Python?

#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, но опять же, он может иметь неправильную форму