Python 中具有多个条件的数据帧上的“Vlookup”(极坐标)

问题描述 投票:0回答:1

我想比较两个 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']

注意我很快翻译了所有非英语的内容。如果我错过了什么或做错了什么,请告诉我。

python dataframe filter xlsx python-polars
1个回答
0
投票

看起来像

.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_*
结果。

© www.soinside.com 2019 - 2024. All rights reserved.