如何使用pandas只对变量的一部分进行比较?

2024-04-20 03:31:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要比较两个数据帧中的代码。我正在使用python3和pandas

在第一个基中,代码总是有18位数字:

dividas_dep = pd.read_csv("dividas_deputados_ajustado_csv.csv",sep=';',encoding = 'latin_1')

dividas_dep.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 106 entries, 0 to 105
Data columns (total 10 columns):
CPF_Deputado                  106 non-null object
CPF_limpo                     106 non-null int64
Nome_Deputado                 106 non-null object
Vinculo                       106 non-null object
CNPJ_Devedor                  106 non-null object
CNPJ_limpo                    106 non-null int64
Nome_Devedor                  106 non-null object
Valores_situacao_Irregular    65 non-null object
Valores_situacao_Regular      52 non-null object
Total_Devido                  106 non-null object
dtypes: int64(2), object(8)
memory usage: 8.4+ KB

第一个基数中的比较列(“CNPJ_Devedor”)有以下示例:17.080.201/0001-49、76.205.723/0001-99、04.885.828/0001-25

在第二个基数中,代码总是有10位数:

funrural = pd.read_excel('DEVEDORES FUNRURAL ATUALIZADO PGFN.xlsx')

funrural.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 8130 entries, 0 to 8129
Data columns (total 14 columns):
PSFN_PGFN               8129 non-null object
Regiao                  8129 non-null object
CNPJ_CEI_Tipo           8129 non-null object
CNPJ_Raiz               8129 non-null object
Razao_Social            8130 non-null object
Valor_principal         8130 non-null float64
Valor_TR_IPC_Poup       8130 non-null float64
Valor_Juros             8130 non-null float64
Valor_SELIC             8130 non-null float64
Valor_Encargo           8130 non-null float64
Valor_Multa_Oficio      8130 non-null float64
Valor_Selic_M_Oficio    8130 non-null float64
Vl_Multa_Mora           8130 non-null float64
Vl_Tot_Credito          8130 non-null float64
dtypes: float64(9), object(5)
memory usage: 889.3+ KB

在第二个基数(“CNPJ_Raiz”)中比较的列有以下示例:04.244.173、05.006.407、03.632.132

“CNPJïu Devedor”和“CNPJïu Raiz”这两个代码在税收立法中是相关的,但我不能这样简单地合并:

compara1 = pd.merge(dividas_dep, funrural, left_on='CNPJ_Devedor', right_on='CNPJ_Raiz')

我需要做的是只比较“CNPJ\u Devedor”的前10位数字和代码“CNPJ\u Raiz”(例如,在“17.080.201/0001-49”中仅使用“17.080.201”)

在Python中有什么方法可以做到这一点吗?或者我应该编辑原始数据帧文件dividas\u dep(dividas\u deputados\u ajustado\u csv.csv)来创建一个只有前10位的新列吗


Tags: columnscsv代码pandasobjectnullvalorpd
1条回答
网友
1楼 · 发布于 2024-04-20 03:31:33

您可以将前10个字符串元素的片段与.str.slice(None, 10)进行比较:

dividas_dep["CNPJ_Devedor"].str.slice(None, 10) == funrural["CNPJ_Raiz"]

示例:

>>> dividas_dep = pd.DataFrame({"CNPJ_Devedor": ['17.080.201/0001-49', '76.205.723/0001-99', '04.885.828/0001-25']})
>>> funrural = pd.DataFrame({"CNPJ_Raiz": ['17.080.201', '04.244.173', '05.006.407']})
>>> dividas_dep["CNPJ_Devedor"].str.slice(None, 10) == funrural["CNPJ_Raiz"]
0     True
1    False
2    False
dtype: bool

您可以使用结果创建新的数据帧:

res = dividas_dep["CNPJ_Devedor"].str.slice(None, 10) == funrural["CNPJ_Raiz"]
funrural[res]

相关问题 更多 >