Dataframe: как выбрать для каждой строки разные столбцы - PullRequest
0 голосов
/ 20 декабря 2018

Рассмотрим кадр данных A с тремя столбцами: a, b и c.Предположим, у нас также есть серия B того же размера, что и A. В каждой строке содержится имя одного из столбцов A.Я хочу построить Series, которая будет содержать значения из таблицы A в столбцах, указанных в B.

Простейшим примером будет следующий:

idxs = np.arange(0, 5)
A = pd.DataFrame({
    'a': [3, 1, 5, 7, 8],
    'b': [5, 6, 7, 3, 1],
    'c': [2, 7, 8, 2, 1],
}, index=idxs)
B = pd.Series(['b', 'c', 'c', 'a', 'a'], index=idxs)

Мне нужно применить некоторые операциичто даст результат, идентичный следующему ряду:

C = pd.Series([5, 7, 8, 7, 8], index=idxs)

В таком простом примере можно выполнить «широковещательную рассылку» следующим образом для чистых пустых массивов:

d = {'a':0, 'b':1, 'c':2 }
AA = A.rename(columns=d).as_matrix()
BB = B.apply(lambda x: d[x]).as_matrix()

CC = AA[idxs, BB]

Это работает,но в моей настоящей проблеме у меня есть многоиндексный Dataframe, и все становится более сложным.

Можно ли это сделать, используя инструменты панд?

Первое, что приходит мне в голову:

A['idx'] = B;
C = A.apply(lambda x: x[x['idx']], axis=1)

Работает!

1 Ответ

0 голосов
/ 20 декабря 2018

Вы можете использовать DataFrame.lookup:

pd.Series(A.lookup(B.index, B), index=B.index)

0    5
1    7
2    8
3    7
4    8
dtype: int64

Решение NumPy, включающее вещание:

A.values[B.index, (A.columns.values == B[:, None]).argmax(1)]
# array([5, 7, 8, 7, 8])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...