我想比较两个 Excel 表格并将数据从一个表格添加到另一个表格。
具体来说,我有一个“排序信息”的表格,其结构如下:
街道 | Hnr_来自 | Hnr_to | hnr_条件 | 邮政编码 | 城市 | 排序信息 |
---|---|---|---|---|---|---|
哈塞尔 | 6 | 8 | 0 | 49082 | 奥斯铌酸锂 | OS1-01 |
哈塞尔 | 1 | 5 | 1 | 49083 | 奥斯铌酸锂 | OS1-02 |
摩泽尔 | 4 | 6 | 2 | 49084 | 蒙斯特 | MU1-01 |
hnr_cond 可以知道是否只有奇数 (1)、偶数 (2) 或所有门牌号 (0) 属于该区的“from”、“to”范围。
我的数据框我想将其与如下所示进行比较:
街道 | Hnr | 邮政编码 | 城市 |
---|---|---|---|
哈塞尔 | 7 | 49082 | 奥斯铌酸锂 |
摩泽尔 | 4 | 49084 | 蒙斯特 |
我第一次尝试了解如何使用 Polars 一般如下:
import polars as pl
xlsx_file = "Path/to/Sortinfo-file.xlsx"
df = pl.read_excel(xlsx_file)
searched_nr = 3
searched_str = "Mosel"
searched_postc = 49088
searched_city = "Osnbr"
filtered_df = df.filter(
(searched_nr >= df['Hnr_from']) &
(searched_nr <= df['Hnr_to']) &
(((searched_nr % 2 == 0) & (df['hnr_cond'] == '2')) |
((searched_nr % 2 == 1) & (df['hnr_cond'] == '1')) |
(df['hnr_cond'] == '0')) &
(searched_str == df['street']) &
(searched_postc == df['Postcode']) &
(searched_city == df['City'])
)
SortInfo = None
if not filtered_df.is_empty():
bezeichnung = filtered_df.to_pandas()['bezirk'].iloc[0]
print(SortInfo)
我还尝试将另一个 Dataframe 作为文件加载,但我只读取了第一行并将其与 SortInfo_df 进行比较,但它忽略了第一行之后的所有内容。
我的最终结果应该如下所示:
数据框包含:
街道 | Hnr | 邮政编码 | 城市 | 排序信息 |
---|---|---|---|---|
哈塞尔 | 7 | 49082 | 奥斯铌酸锂 | OS1-01 |
摩泽尔 | 4 | 49084 | 蒙斯特 | MU1-01 |
我尝试像这样加载其他文件:
xlsx_file = "path/to/other-file.xlsx"
df_searched = pl.read_excel(xlsx_file)
searched_number = df_seached['Hnr']
searched_street = df_searched['street']
searched_postcode = df_searched['Postcode']
searched_City = df_searched['City']
注意我很快翻译了所有非英语的内容。如果我错过了什么或做错了什么,请告诉我。
.join_asof()
问题。
https://pola-rs.github.io/polars-book/user-guide/transformations/joins/#asof-join
您可以使用
by
参数来指定应匹配相等性的列。
table = pl.DataFrame(
{
"street": ["Hasel", "Hasel", "Mosel"],
"Hnr_from": [6, 1, 4],
"Hnr_to": [8, 5, 6],
"hnr_cond": [0, 1, 2],
"Postcode": [49082, 49083, 49084],
"City": ["Osnb", "Osnb", "Munst"],
"SortInfo": ["OS1-01", "OS1-02", "MU1-01"],
}
)
df = pl.DataFrame(
{
"street": ["Hasel", "Mosel"],
"Hnr": [7, 4],
"Postcode": [49082, 49084],
"City": ["Osnb", "Munst"],
}
)
df.join_asof(
table,
by=["street", "Postcode", "City"],
left_on="Hnr",
right_on="Hnr_to",
strategy="forward",
)
shape: (2, 8)
┌────────┬─────┬──────────┬───────┬──────────┬────────┬──────────┬──────────┐
│ street ┆ Hnr ┆ Postcode ┆ City ┆ Hnr_from ┆ Hnr_to ┆ hnr_cond ┆ SortInfo │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ i64 ┆ i64 ┆ str ┆ i64 ┆ i64 ┆ i64 ┆ str │
╞════════╪═════╪══════════╪═══════╪══════════╪════════╪══════════╪══════════╡
│ Hasel ┆ 7 ┆ 49082 ┆ Osnb ┆ 6 ┆ 8 ┆ 0 ┆ OS1-01 │
│ Mosel ┆ 4 ┆ 49084 ┆ Munst ┆ 4 ┆ 6 ┆ 2 ┆ MU1-01 │
└────────┴─────┴──────────┴───────┴──────────┴────────┴──────────┴──────────┘
然后您可以使用您指定的
.filter()
条件来 Hnr_*
结果。