DataFrame pandas разрешает внутренние ссылки на строки - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть кадр данных, который выглядит следующим образом:

a = [
    {'x': 1, 'y': 1, 'q': [], 'obj': 901},
    {'x': 1, 'y': 2, 'q': [(3, 3)], 'obj': 907},
    {'x': 1, 'y': 3, 'q': [], 'obj': 884},
    {'x': 2, 'y': 1, 'q': [(2, 2), (3, 3)], 'obj': 485},
    {'x': 2, 'y': 2, 'q': [], 'obj': 814},
    {'x': 2, 'y': 3, 'q': [], 'obj': 491},
    {'x': 3, 'y': 1, 'q': [], 'obj': 822},
    {'x': 3, 'y': 2, 'q': [], 'obj': 752},
    {'x': 3, 'y': 3, 'q': [(1, 3), (2, 1)], 'obj': 739}
]

df = pd.DataFrame(a)

Я хочу добавить новый столбец, ref, который представляет собой список obj для каждой ссылки (x, y) в q,Я знаю, что могу перебирать q для каждой строки, но это медленно и глупо.

Результат должен выглядеть следующим образом:

   obj                 q         ref  x  y
0  901                []         NaN  1  1
1  907          [(3, 3)]       [907]  1  2
2  884                []         NaN  1  3
3  485  [(2, 2), (3, 3)]  [814, 739]  2  1
4  814                []         NaN  2  2
5  491                []         NaN  2  3
6  822                []         NaN  3  1
7  752                []         NaN  3  2
8  739  [(1, 3), (2, 1)]  [884, 485]  3  3

Каким образом панды решают эту проблему?

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Вы можете искать в MultiIndex:

df1 = df.set_index(['x','y'])
df['ref'] = [[df1.at[y, 'obj'] for y in x] if x else np.nan for x in df1['q']]
print (df)
   obj                 q  x  y         ref
0  901                []  1  1         NaN
1  907          [(3, 3)]  1  2       [739]
2  884                []  1  3         NaN
3  485  [(2, 2), (3, 3)]  2  1  [814, 739]
4  814                []  2  2         NaN
5  491                []  2  3         NaN
6  822                []  3  1         NaN
7  752                []  3  2         NaN
8  739  [(1, 3), (2, 1)]  3  3  [884, 485]
0 голосов
/ 28 сентября 2018

Не уверен в панда, как это сделать, но итерация поможет.

mapping = {(x, y) : z for x, y, z in df[['x', 'y', 'obj']].values.tolist()}
df['refs'] = [
    [mapping.get(idx) for idx in idxs] if idxs else np.nan for idxs in df['q']]

   obj                 q  x  y        refs
0  901                []  1  1         NaN
1  907          [(3, 3)]  1  2       [739]
2  884                []  1  3         NaN
3  485  [(2, 2), (3, 3)]  2  1  [814, 739]
4  814                []  2  2         NaN
5  491                []  2  3         NaN
6  822                []  3  1         NaN
7  752                []  3  2         NaN
8  739  [(1, 3), (2, 1)]  3  3  [884, 485]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...