Найти ближайший элемент столбца данных pandas в списке другого столбца - PullRequest
0 голосов
/ 25 октября 2018

У меня есть следующий фрейм данных:

A = [3,38,124]
B = [[0,0,1,7,34,76,4,15,28,8,7,8,200,108,7],[0,0,1,7,34], 
    [4,109,71,257,3,3,7,1,0,0,7,8,100,148,54,3,134,90,23,43,17]]

df = pd.DataFrame({'A':A,
   'B':B})
df 

В столбце B есть списки в качестве элементов.Я хочу создать новый столбец с ближайшим элементом к столбцу A, содержащимся в соответствующем списке B.

Желаемый результат:

A = [3,38,124]
B = [[0,0,1,7,34,76,4,15,28,8,7,8,200,108,7],[0,0,1,7,34], 
[4,109,71,257,3,3,7,1,0,0,7,8,100,148,54,3,134,90,23,43,17]]
Desired_output=[4,34,134]
df_out = pd.DataFrame({'A':A,
   'B':B,
              'Desired_output':Desired_output})
df_out=df_out [['A','B','Desired_output']]
df_out 

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Чтобы завершить предыдущий ответ, если вы хотите сделать это после помещения данных в DataFrame, используйте функцию DataFrame.apply следующим образом:

import pandas as pd
import numpy as np

A = [3, 38, 124]
B = [[0, 0, 1, 7, 34, 76, 4, 15, 28, 8, 7, 8, 200, 108, 7],
     [0, 0, 1, 7, 34],
     [4, 109, 71, 257, 3, 3, 7, 1, 0, 0, 7, 8, 100, 148, 54, 3, 134, 90, 23, 43, 17]]
df = pd.DataFrame({'A': A, 'B': B})

def find_nearest(row):
    return row["B"][np.argmin([abs(candidate-row["A"]) for candidate in row["B"]])]

df["desired_output"] = df.apply(find_nearest, axis=1)

print(df)
0 голосов
/ 25 октября 2018

Попробуйте сделать это, прежде чем поместить его в DataFrame, например:

C = [B[i][np.argmin(np.abs(np.array(B[i]) - A[i]))] for i in range(len(A))]
df = pd.DataFrame({'A':A,
   'B':B, 'Closest':C})

Вывод:

     A                                                B    Closest
0    3  [0, 0, 1, 7, 34, 76, 4, 15, 28, 8, 7, 8, 200, ...    4
1   38                                   [0, 0, 1, 7, 34]   34
2  124  [4, 109, 71, 257, 3, 3, 7, 1, 0, 0, 7, 8, 100,...  134
...