как сгенерировать новый фрейм данных из вложенного для l oop в python? - PullRequest
0 голосов
/ 10 апреля 2020

Я новичок ie для языка Pyhton. Прямо сейчас я собираюсь создать фрейм данных из вложенного l oop. Прямо к данным. Пример: X_train. X_train имеет 9 строк и 4 столбца (или функции)

print(X_train)
          0      1      2      3
  0     0.00   0.00   0.09   0.00
  1     0.10   0.00   0.00   0.12
  2     0.71   0.00   0.40   0.20
  3     1.00   0.00   0.54   0.14
  4     0.88   0.00   0.65   0.28
  5     0.77   0.00   0.68   0.33
  6     0.71   0.00   0.97   0.43
  7     0.65   0.00   0.56   0.69
  8     0.27   1.00   0.24   1.00

Затем я создаю функцию (вложенную для l oop) для создания нового кадра данных, который имеет размер строк и столбцов (например, квадрат матрицы) , Ниже функции:

import pandas as pd
def function1(data):
    for i in range(len(X_train.index)):  
        for j in range(len(X_train.index)):        
            sum_row = 0
            distance = 0
            for k in range(len(X_train.columns)):         
                distance = pow((X_train.values[i,k]-X_train.values[j,k]),2)
                sum_row = sum_row + distance
            df_test1 = pd.DataFrame(sum_row, index=[i], columns=[j])
            print(df_test1)

Результат этой функции:

function1(X_train)
     0
0  0.0
          1
0  0.035896
          2
0  0.654024
          3
0  1.228754
          4
0  1.171765
          5
0  1.063763
          6
0  1.485153
          7
0  1.140283
          8
0  2.096477
          0
1  0.035896
     1
1  0.0
          2
1  0.544068
          3
1  1.10117
          4
1  1.053592
          5
1  0.958978
          6
1  1.421161
          7
1  0.946359
          8
1  1.841666
      .
      .
      .
          0
8  2.096477
          1
8  1.841666
          2
8  1.854826
          3
8  2.346288
          4
8  2.059677
          5
8  1.892121
          6
8  2.065235
          7
8  1.345284
     8
8  0.0

Из приведенного выше объяснения и на основе вопроса ожидаемый кадр данных, который я хочу:

function1(X_train)
      0     1     2     3     4     5     6     7     8
0   0.00   0.03  0.65  1.22  1.17  1.06  1.48  1.14  2.09
1   0.03   0.00  0.54  1.10  1.05  0.95  1.42  0.94  1.84
2     .      .     .     .     .     .     .     .     .    
3     .      .     .     .     .     .     .     .     .   
4     .      .     .     .     .     .     .     .     .   
5     .      .     .     .     .     .     .     .     .  
6     .      .     .     .     .     .     .     .     .   
7     .      .     .     .     .     .     .     .     .   
8   2.09   1.84  1.85  2.34  2.05  1.89  2.06  1.34  0.00

Надеюсь, кто-нибудь поможет мне решить эту проблему. Спасибо

1 Ответ

0 голосов
/ 11 апреля 2020

Чтобы упростить процесс, вы можете сначала создать массив, а затем преобразовать его в массив данных. Тогда вашей функции лучше использовать существующие параметры, использовать data , а не X_train

Код будет выглядеть так:

import pandas as pd
def function1(data):
    df_test1 = [[] for i in range(len(data.index))]
    for i in range(len(data.index)):
        for j in range(len(data.index)):
            sum_row = 0
            distance = 0
            for k in range(len(data.columns)):
                distance = pow((data.values[i,k]-data.values[j,k]),2)
                sum_row = sum_row + distance
            df_test1[i].append(sum_row)
    df_test1 = pd.DataFrame(df_test1)
    return df_test1

df_test1 = function1(X_train)
df_test1
...