首页 > 解决方案 > 如何使用 PANDAS 数据框中的值作为正则表达式中的过滤器参数?

问题描述

我想将 Pandas df 中的值用作 SPARQL 查询中的过滤器参数。

通过从 excel 文件中读取数据,我正在创建 pandas 数据框:


xls = pd.ExcelFile ('excel/dataset_nuovo.xlsx')

df1 = pd.read_excel(xls, 'Sheet1')

print(df1)

这里生成的数据框:


              oggetto                                        descrizione  lenght label        tipologia
0       @iccd4580759@         Figure: putto. Oggetti: ghirlanda di fiori       6   Bad  OpereArteVisiva
1       @iccd3636719@                              Decorazione plastica.       2   Bad  OpereArteVisiva
2       @iccd3641475@                          Scultura.. Figure: angelo       3   Bad  OpereArteVisiva
3       @iccd8282504@  Custodia di reliquiario in legno intagliato e ...       8  Good  OpereArteVisiva
4       @iccd3019633@                                           Portale.       1   Bad  OpereArteVisiva
...               ...                                                ...     ...   ...              ...
59995   @iccd2274873@  Ciotola media a larga tesa. Decorazione in cob...      35  Good  OpereArteVisiva
59996  @iccd11189887@  Il medaglione bronzeo, sormontato da un'aquila...      85  Good  OpereArteVisiva
59997   @iccd4545324@  Tessuto di fondo rosaceo. Disegno a fiori e fo...      49  Good  OpereArteVisiva
59998   @iccd2934870@  Sculture a tutto tondo in legno dipinto di bia...      28  Good  OpereArteVisiva
59999   @iccd2685205@  Calice con piede a base circolare e nodo ovoid...      14   Bad  OpereArteVisiva

然后我需要使用oggetto列中的值作为过滤器来检索(每条记录)subject来自 SPARQL 端点的相对值。

通过使用此 SPARQL 查询:


SELECT ?object ?description  (group_concat(?subject;separator="|") as ?subjects) 

                            WHERE { ?object     a   crm:E22_Man-Made_Object;
                                                        crm:P3_has_note ?description;
                                                        crm:P129_is_about ?concept;
                                                        crm:P2_has_type ?type.
                                    ?concept    a   crm:E28_Conceptual_Object;
                                                        rdfs:label ?subject.
        
                                    filter( regex(str(?object), "@iccd4580759@" ))    
                                    
                                    }

我能够过滤一条记录。

  object.type                                       object.value  ... subjects.type                                     subjects.value
0         uri  http://dati.culturaitalia.it/resource/oai-oaic...  ...       literal  Putto con ghirlanda di fiori|Putto con ghirlan..

由于数据集是 60k 条记录,我将通过循环遍历数据框并使用该值作为过滤器来使该过程自动化,从而获得具有相对subjectcol 的新 df。


              oggetto                                        descrizione  subject                                               lenght label        tipologia
0       @iccd4580759@         Figure: putto. Oggetti: ghirlanda di fiori  Putto con ghirlanda di fiori|Putto con ghirlan..          6   Bad  OpereArteVisiva

这是我写的整个脚本:


import xlrd

import pandas as pd
from pandas import json_normalize
from SPARQLWrapper import SPARQLWrapper, JSON

xls = pd.ExcelFile ('excel/dataset_nuovo.xlsx')

df1 = pd.read_excel(xls, 'Sheet1')

print(df1)

def query_ci(sparql_query, sparql_service_url):
    
    sparql = SPARQLWrapper(sparql_service_url)  
    
    sparql.setQuery(sparql_query)
    sparql.setReturnFormat(JSON)

    # ask for the result
    result = sparql.query().convert()
    return json_normalize(result["results"]["bindings"])

sparql_query    =   """     SELECT ?object ?description  (group_concat(?subject;separator="|") as ?subjects) 

                            WHERE { ?object     a   crm:E22_Man-Made_Object;
                                                        crm:P3_has_note ?description;
                                                        crm:P129_is_about ?concept;
                                                        crm:P2_has_type ?type.
                                    ?concept    a   crm:E28_Conceptual_Object;
                                                        rdfs:label ?subject.
        
                                    filter( regex(str(?object), "@iccd4580759@" ))    
                                    
                                    }

                    """

sparql_service_url = "http://dati.culturaitalia.it/sparql"

result_table = query_ci(sparql_query, sparql_service_url)

print (result_table)

result_table.to_excel("output.xlsx")

有可能这样做吗?

标签: pythonpandasdataframe

解决方案


推荐阅读