Python 在缺少条目的特定列变量上合并两个表/数组(*.xlsx)文件

Python 在缺少条目的特定列变量上合并两个表/数组(*.xlsx)文件,python,excel,matlab,data-analysis,Python,Excel,Matlab,Data Analysis,所以,我在MacBook上有两个Excel表格,我想合并它们。它们相当大。一个具有维度(42912,6),另一个具有维度(41424,7)。因此,以下是它们的几个示例: 表A | Country | Continent | |------------- |--------------- | | UK | Europe | | France | Europe | | Germany

所以,我在MacBook上有两个Excel表格,我想合并它们。它们相当大。一个具有维度
(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缺少其中一个国家—
德国
。此外表B列出了英国
下的2个城市,其中表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
row)。当表B在同一个国家/地区有多行时,将在表A中创建额外的行(例如,
UK
),以适应不同的国家/地区

我真的很想得到一些帮助,了解如何合并这两个行(考虑到它们每个行超过4万行),而不是在Excel中逐行进行合并,这需要花费很多时间

我很乐意使用Python或Matlab等,甚至更简单——这是一种在Excel for Mac中实现的方法


谢谢

对于包含
Bristol
的行,数据中的一个问题是缺少
Country
条目。由于要在
Country
键上进行合并,因此合并例程不知道如何以表当前的形式合并这些行。之前进行一些数据争用将有所帮助,如下所述

Python解决方案:

使用
pandas
读取两个excel文件并用于合并。将解决上述“布里斯托尔”问题

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>Version2013b提供了数据类型,对于像您这样的连接目的,它与pd一样方便。DataFrame是Python格式的。为了解决缺少
国家
值的问题,MATLAB提供了函数。将表与合并

table1=xls2table_,带有_fillmissing('stackoverflow1.xlsx','Country');
table2=xls2table_,带有_fillmissing('stackoverflow2.xlsx','Country');
%合并并写入新的excel文件
合并的表=外部连接(表1、表2,‘类型’、‘左’、。。。
“合并键”,正确);
writetable(合并表格'stackoverflow\u merged.xlsx')
函数表=xls2table_,缺少_填充(xls_路径,填充键)
%将xls读取到表中,并用的值填充空的'Country'条目
%上一行。
table=可读表(xls\u路径);
表(:,fill_key)=fillmissing(表(:,fill_key),'previous');
结束

在这两种情况下,结果都是excel表格,如下所示:

| 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     |


如您所见,由于应用了
ffill()
/
fillmissing
,在
Bristol
行的
Country
列中填充了一个
UK
。除此之外,它还符合您的期望。

您基本上是在两个表之间应用
完全外部联接。在matlab中,您可以使用函数
outerjoin(TableA,TableB)
。请检查如何使用它,或者是这样做,谢谢!我很快会试一试,看看是否有效。我一直在尝试使用
join
函数,尽管我一直遇到很多错误,包括因为行数不同,我支持@obchardon的注释。但是,简单的
outerjoin
无法处理要合并的列中缺少的值,即
Country
。请看我在python和MATLAB中如何处理这个问题的答案。非常感谢您的详细回复。我真的很感激。这对我来说真是太棒了!这似乎比我最初想象的要简单得多。我只是缺少了一些小东西,比如fillmissing函数。