Как можно объединить 2 кадра данных на основе списка кортежей, где каждый кортеж содержит соответствующий ключ из каждого кадра данных? - PullRequest
0 голосов
/ 08 января 2019

У меня есть 2 кадра данных панд, которые я хочу объединить в 1 новый кадр данных. У меня есть список кортежей, где первый элемент каждого кортежа - это индекс строки в первом кадре данных, а второй элемент - это индекс строки во втором.

Вот пример:

### input sample

# table A
    col_a   col_b
0   1       2
1   4       5
2   7       8
3   1       1

# table B
    col_c   col_d
0   3       3
1   9       8
2   7       3
3   2       1

list_of_couples = [(0,1),(3,0)] # (index from table A, index from table B)

### expected output

    col_a   col_b   col_c   col_d
0   1       2       9       8
1   1       1       3       3

Я пробовал перебирать список кортежей и добавлять объединенные строки одну за другой в новый df, но это занимает много времени.
Как это можно сделать эффективно? спасибо!

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Я бы попытался создать временный ключ для присоединения:

#unzip list_of_couples into index for table_a and table_b
a, b  = zip(*list_of_couples)

#Loop on length of index to assign same value of key to each table for the appropriate index
for i in range(len(a)):
    df_a.loc[a[i], 'key'] = i
    df_b.loc[b[i], 'key'] = i

#merge dataframes on 'key', remove NaN records and drop temporary 'key' column
df_a.merge(df_b, on='key').dropna(subset=['key']).drop('key', axis=1)

Выход:

   col_a  col_b  col_c  col_d
0      1      2      9      8
5      1      1      3      3
0 голосов
/ 08 января 2019

Вы можете создать фрейм данных из списка кортежей, а затем объединить дважды. например,

# Create df from list of tuples
tuple_df = pd.DataFrame(list_of_couples, columns=['a', 'b'])

# Merge table_a with tuples
merged = pd.merge(table_a, tuple_df, left_index=True, right_on='a')

# Merge result with table_b
merged = pd.merge(merged, table_b, right_index=True, left_on='b')

# Removing intermediate join columns
merged = merged.drop(['a','b'], axis=1)

>>> print(merged)

  col_a col_b col_c col_d
0     1     2     9     8
1     1     1     3     3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...