Объединение двух файлов таблиц / массивов (* .xlsx) в определенной переменной столбца, в которой отсутствуют записи - PullRequest
1 голос
/ 16 января 2020

Итак, у меня есть две таблицы Excel, которые я собираюсь объединить на своем MacBook. Они довольно большие. Один имеет размеры (42912, 6), а другой имеет размеры (41424,7). Поэтому вот несколько примеров того, как они выглядят:

Таблица A

| Country       | Continent         |
|-------------  |---------------    |
| UK            | Europe            |
| France        | Europe            |
| Germany       | Europe            |
| USA           | North America     |
| New Zealand   | Oceania           |

Таблица B

| Country       | City      | Population    |
|-------------  |---------- |------------   |
| UK            | London    | 8,900,000     |
|               | Bristol   | 53,907        |
| France        | Paris     | 2,141,000     |
| USA           | New York  | 8,623,000     |
| New Zealand   | Auckland  | 1,657,000     |

Вы можете увидеть некоторые различия между два. Например, хотя в таблице A перечислены 5 стран, в таблице B отсутствует одна из них - Germany. К тому же. В таблице B есть 2 города, перечисленные в UK, где в таблице A только одна строка.

По сути, я хочу иметь возможность объединить две таблицы, чтобы они выглядели так:

| Country       | Continent         | City      | Population    |
|-------------  |---------------    |---------- |------------   |
| UK            | Europe            | London    | 8,900,000     |
|               |                   | Bristol   | 53,907        |
| France        | Europe            | Paris     | 2,141,000     |
| Germany       | Europe            |           |               |
| USA           | North America     | New York  | 8,623,000     |
| New Zealand   | Oceania           | Auckland  | 1,657,000     |

Две таблицы объединяются строкой / столбцом Country, которые они оба имеют общее, эффективно добавляя оставшиеся релевантные строки из таблицы B в таблицу A.

Когда в таблице A есть строка, которой нет в таблице B, столбцы просто остаются пустыми (Germany строка как пример). Когда в таблице B несколько строк в одной и той же стране, в таблице A создаются дополнительные строки (например, UK).

Я был бы очень признателен за помощь в понимании того, как я могу объединить эти два ( учитывая, что у них более 40 тыс. строк в каждой), вместо того, чтобы делать это построчно в Excel, что заняло бы целую вечность.

Я очень рад работать с Python или Matlab et c., Или даже проще - способ сделать это в Excel для Ma c.

Спасибо!

1 Ответ

1 голос
/ 17 января 2020

Проблема в ваших данных отсутствует Country записей для строк, подобных той, которая содержит Bristol. Поскольку вы хотите объединить с помощью клавиши Country, подпрограммы слияния не будут знать, как объединить эти строки в той форме, в которой находятся ваши таблицы. Поможет выполнение некоторых обработок данных, как описано ниже.

Python решение:

Используйте pandas для чтения обоих файлов Excel и pd.merge() для слияния. pd.DataFrame.ffill() решит проблему "Бристоля", описанную выше.

import pandas as pd


def xls2df_with_ffill(xls_path, fill_key):
    """
    reads xls to dataframe and fills empty `Country` entries with the values
    of the previous row.
    """
    df = pd.read_excel(xls_path)
    df.loc[:, fill_key] = df.loc[:, fill_key].ffill()

    return df


df1 = xls2df_with_ffill('stackoverflow1.xlsx', 'Country')
df2 = xls2df_with_ffill('stackoverflow2.xlsx', 'Country')

# do the merge and write to new excel file
merged_df = pd.merge(df1, df2, how='outer', on='Country')
merged_df.to_excel('stackoverflow_merged.xlsx')

Решение MATLAB:

MATLAB> версия 2013b обеспечивает тип данных table, который так же удобен для присоединения, как ваша, как pd.DataFrame в Python. Чтобы решить проблему отсутствующего значения Country, MATLAB предоставляет функцию fillmissing. Объедините таблицы с outerjoin.

table1 = xls2table_with_fillmissing('stackoverflow1.xlsx', 'Country');
table2 = xls2table_with_fillmissing('stackoverflow2.xlsx', 'Country');

% do the merge and write to new excel file
merged_table = outerjoin(table1, table2, 'Type', 'Left', ...
    'MergeKeys', true);
writetable(merged_table, 'stackoverflow_merged.xlsx')


function table = xls2table_with_fillmissing(xls_path, fill_key)
% reads xls to table and fills empty `Country` entries with the values of
% the previous row. 
    table = readtable(xls_path);
    table(:, fill_key) = fillmissing(table(:, fill_key), 'previous');
end

. В обоих случаях функции - это таблица Excel, которая выглядит следующим образом:

enter image description here

Как видите, из-за применения ffill() / fillmissing в столбце Country в строке Bristol заполняется UK. Кроме того, это соответствует вашим ожиданиям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...