我想要一个 pandas 脚本根据第一个电子表格中的值将一个 excel 表中的值排列到另一个表中

Posted

技术标签:

【中文标题】我想要一个 pandas 脚本根据第一个电子表格中的值将一个 excel 表中的值排列到另一个表中【英文标题】:I want a pandas script to line up values from one excel sheet to another based on the values in the first spreadsheet 【发布时间】:2020-11-30 00:40:37 【问题描述】:

这个问题似乎很模糊,以前也有人问过类似的问题,但我还是很困惑!任何帮助都感激不尽。我没有很好的编程背景,所以我的措辞不是很好,希望你能理解:

我有两个包含成千上万个数据点的 Excel 电子表格。第一个(表 A)有地址,例如:

   house_number        street      suburb
0            43  Smith Street   Frewville
1            45  Smith Street   Frewville
2            47  Smith Street   Frewville
3            49  Smith Street   Frewville
4            51  Smith Street   Frewville
5            53  Smith Street   Frewville
6             1   Flinders St  Kensington
7             3   Flinders St  Kensington
8             5   Flinders St  Kensington
9             7   Flinders St  Kensington

第二个(表 B)有一些相同的街道,但也有一个 ID 列,例如:

          ID  house_number           street      suburb
0    5509            43     Smith Street   Frewville
1    5120            26    Taylor Avenue    Glenside
2    4731            34  Brussels Street   Frewville
3    4342            12  Brussels Street   Frewville
4    3953             1      Roger Court     Clifton
5   12098             4     Elizabeth St     Clifton
6    2024             7      Flinders St  Kensington
7   28388            10        Queens Rd  Kensington
8   36533            13        Queens Rd  Kensington
9    4478           346   Jefcott Street    Glenside
10  52823            19   Jefcott Street    Glenside

我想要一个 pandas 脚本,如果地址在两个 Excel 工作表中,则使用工作表 B 中的 ID 在工作表 A 中添加一列

尝试移除 NaN?

import pandas as pd
df1 = pd.read_excel('sheeta.xlsx')
df2 = pd.read_excel('sheetb.xlsx')

sheet1 = df1.join(
(df1.reset_index()  # make a column of pandas index so join can work
     .merge(df2, on=["house_number","street","suburb"], how="inner") # find fullmatches
     .set_index("index") # make index same as original sheeta
     .loc[:,["ID"]] # only want ID column to go back into join
     .astype("Int64") # force the types that support int NaN
     .dropna(sheet1)
))
print(sheet1)

【问题讨论】:

一切都是关于方法而不是编码能力。通常会有数据质量问题,你如何处理这些问题。你认为什么是比赛?最简单的是全文匹配,如果允许其他匹配,如何定义两个地址相同。从您需要帮助的每个工作表中提供 10 行。 (df.to_dict(orient="list") 所以很容易粘贴到 IDE 中) 感谢您的帮助,尽管缺乏信息,这有帮助吗? 有一些错误。有时有 'st' 而不是 'street' 等。也有些人有错误的郊区。全文匹配可能是我目前所能处理的!哈哈再次感谢您的宝贵时间 【参考方案1】:

评论了方法的解释。找到了两个地址,其中 sheet2 中的 ID 返回到 sheet1

import io
sheeta = pd.read_csv(io.StringIO("""   house_number        street      suburb
0            43  Smith Street   Frewville
1            45  Smith Street   Frewville
2            47  Smith Street   Frewville
3            49  Smith Street   Frewville
4            51  Smith Street   Frewville
5            53  Smith Street   Frewville
6             1   Flinders St  Kensington
7             3   Flinders St  Kensington
8             5   Flinders St  Kensington
9             7   Flinders St  Kensington"""), sep="\s\s+", engine="python")
sheetb = pd.read_csv(io.StringIO("""ID  house_number           street      suburb
0    5509            43     Smith Street   Frewville
1    5120            26    Taylor Avenue    Glenside
2    4731            34  Brussels Street   Frewville
3    4342            12  Brussels Street   Frewville
4    3953             1      Roger Court     Clifton
5   12098             4     Elizabeth St     Clifton
6    2024             7      Flinders St  Kensington
7   28388            10        Queens Rd  Kensington
8   36533            13        Queens Rd  Kensington
9    4478           346   Jefcott Street    Glenside
10  52823            19   Jefcott Street    Glenside"""), sep="\s\s+", engine="python")

sheet1 = sheeta.join(
(sheeta.reset_index()  # make a column of pandas index so join can work
     .merge(sheetb, on=["house_number","street","suburb"], how="inner") # find fullmatches
     .set_index("index") # make index same as original sheeta
     .loc[:,["ID"]] # only want ID column to go back into join
     .astype("Int64") # force the types that support int NaN
))

print(sheet1.to_string())

输出

   house_number        street      suburb    ID
0            43  Smith Street   Frewville  5509
1            45  Smith Street   Frewville  <NA>
2            47  Smith Street   Frewville  <NA>
3            49  Smith Street   Frewville  <NA>
4            51  Smith Street   Frewville  <NA>
5            53  Smith Street   Frewville  <NA>
6             1   Flinders St  Kensington  <NA>
7             3   Flinders St  Kensington  <NA>
8             5   Flinders St  Kensington  <NA>
9             7   Flinders St  Kensington  2024

【讨论】:

太棒了!如果我在 excel 上有其他不需要匹配的列,是否需要更改脚本?我也可以删除带有 NaN 的行吗? 如果你只想要匹配的行,这里需要做更多的工作 - merge() 正在做所有的工作,只返回两行......你也可以选择使用dropna() 稍后删除。我认为更多的列不会搞砸 - 因为代码只选择一列“ID”返回

以上是关于我想要一个 pandas 脚本根据第一个电子表格中的值将一个 excel 表中的值排列到另一个表中的主要内容,如果未能解决你的问题,请参考以下文章

用于 Excel 电子表格的 Pandas groupby

使用 Pandas 代码创建独立文件

仅通过 Google Apps 脚本值修改 Google 电子表格

使用带有文件列表的 Pandas read_table

带有自定义脚本的公式不会在 Google 电子表格中更新

Google 表格脚本 - 根据单元格作为今天的日期发送电子邮件