Есть ли метод Pandas для объединения на основе индекса и столбца? - PullRequest
2 голосов
/ 16 июня 2020

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

import pandas as pd

dates = pd.date_range('2020-01-01', '2020-01-03', freq='d')
A = pd.DataFrame({
    'i': [1,2,3],
}, index=dates)
B = pd.DataFrame({
    1: [11, 12, 13],
    2: [21, 22, 23],
    3: [31, 32, 33],
}, index=dates)

# replace this with a more efficient method, avoiding for-loop and creating C
r = [B.loc[k, v] for k, v in A.i.items()]
C = pd.DataFrame({'B': r}, index=dates)
pd.merge(A, C, left_index=True, right_index=True)

ожидаемый результат:

                i   B
    2020-01-01  1  11
    2020-01-02  2  22
    2020-01-03  3  33

Ответы [ 2 ]

2 голосов
/ 16 июня 2020

Если я вас правильно понял:

# Reshape main df with index as (date, i), remove axis name
_A = A.set_index('i', append=True).rename_axis(index=lambda x: None)

# Reshape sub df with index as (date, i), name series (column) as 'B'
_B = B.stack().rename('B')

# perform left join on indices
_A.merge(_B, how='left', left_index=True, right_index=True)

Результат:

               B
2020-01-01 1  11
2020-01-02 2  22
2020-01-03 3  33

Вы можете связать весь набор в одну строку, но я бы не рекомендовал это чудовище:

A.set_index('i', append=True).rename_axis(index=lambda x: None) \
    .merge(B.stack().rename('B'), how='left', left_index=True, right_index=True)
0 голосов
/ 16 июня 2020

Вы можете использовать lookup в этой ситуации:

A['B'] = B.lookup(A.index, A['i'])
print(A)

Вывод:

            i   B
2020-01-01  1  11
2020-01-02  2  22
2020-01-03  3  33
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...