Python 在缺少条目的特定列变量上合并两个表/数组(*.xlsx)文件
所以,我在MacBook上有两个Excel表格,我想合并它们。它们相当大。一个具有维度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
(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函数。