我想要一个 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 表中的值排列到另一个表中的主要内容,如果未能解决你的问题,请参考以下文章