Python: DataFrame ndarray расстояние с правильной функцией для каждого типа столбца? - PullRequest
0 голосов
/ 20 февраля 2019

Имея этот фрейм данных:

self.data_frame = pd.read_csv (self.path, delimiter = self.delimiter)

   height  weight  shoe_size  age  name
0     175      70         40   30  John
1     175      75         39   41  Frank
2     175      69         40   33  Bill
3     176      71         40   35  George
4     178      81         41   27  John
5     169      73         38   49  Jonathan
6     170      65         39   30  Rick

Мне нужно рассчитатьрасстояние каждой строки от всех остальных, ячейка за ячейкой.

Для числовых столбцов я вычисляю разницу следующим образом:

columns_data: ndarray = self.data_frame ["weight "," height "]. values ​​

[[70, 175]
 [75, 175]
 [69, 175]
 [71, 176]
 [81, 178]
 [73, 169]
 [65, 170]]

dist: ndarray = np.abs (columns_data [:, None] - columns_data)

и я получаю такой массив:

[[[ 0,  0],
  [ 5,  0],
  [ 1,  0],
  [ 1,  1],
  [11,  3],
  [ 3,  6],
  [ 5,  5]],

 [[ 5,  0],
  [ 0,  0],
  [ 6,  0],
  [ 4,  1],
  [ 6,  3],
  [ 2,  6],
  [10,  5]],

 [[ 1,  0],
  [ 6,  0],
  [ 0,  0],
  [ 2,  1],
  [12,  3],
  [ 4,  6],
  [ 4,  5]],

 [[ 1,  1],
  [ 4,  1],
  [ 2,  1],
  [ 0,  0],
  [10,  2],
  [ 2,  7],
  [ 6,  6]],

 [[11,  3],
  [ 6, 3],
  [12,  3],
  [10,  2],
  [ 0, 0],
  [ 8,  9],
  [16,  8]],

 [[ 3,  6],
  [ 2,  6],
  [ 4,  6],
  [ 2,  7],
  [ 8,  9],
  [ 0,  0],
  [ 8,  1]],

 [[ 5,  5],
  [10,  5],
  [ 4, 5],
  [ 6,  6],
  [16,  8],
  [ 8,  1],
  [ 0,  0]]
]

Итак, моя проблема связана со столбцом name , который состоит из строк.Я бы использовал расстояние Левенштейна между словами, но как я могу указать функцию для каждого типа столбца при генерации ndarray?

1 Ответ

0 голосов
/ 20 февраля 2019

если вам нужно применить определенную функцию к каждому столбцу в Dataframe, используйте метод map.Метод map вначале принимает функцию, которую вы хотите использовать, а затем столько списка, сколько есть параметров для функции, которую вы используете.map(func, iter).map вернет объект карты, поэтому всегда приводите карту к списку, list(map(func, iter) Например, если вы хотите вычесть все значения высоты столбца из веса, вы должны сделать

def subtract(a, b):
    return a - b
self.data_frame['height minus weight'] = list(map(subtract, self.data_frame['height'], self.data_frame['weight']))

, оставаясь вИмейте в виду, что я создаю совершенно новый столбец в Dataframe.Если вы хотите просто сохранить его в массиве Numpy, вы должны изменить self.data_frame['height minus weight'] = list(map(subtract,self.data_frame['height'], self.data_frame['weight'])) на array = np.array(list(map(subtract,self.data_frame['height'], self.data_frame['weight'])))

...