在Python 3中,使用pandas,我在“CPF_CNPJ_doador”和“CPF_CNPJ_doador_originario”列中有几个代码的数据框
cand_doacoes = pd.read_csv("doacoes_csv.csv",sep=';',encoding = 'latin_1', decimal = ",")
cand_doacoes.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 427489 entries, 0 to 427488
Data columns (total 12 columns):
UF 427489 non-null object
Partido 427489 non-null object
Cargo 427489 non-null object
Nome_candidato 427489 non-null object
CPF_candidato 427489 non-null int64
CPF_CNPJ_doador 426681 non-null float64
Nome_doador 427489 non-null object
Nome_doador_Receita 427489 non-null object
Valor 427489 non-null float64
CPF_CNPJ_doador_originario 427489 non-null object
Nome_doador_originario 427489 non-null object
Nome_doador_originario_Receita 427489 non-null object
dtypes: float64(2), int64(1), object(9)
memory usage: 39.1+ MB
“CPF_CNPJ_doador”和“CPF_CNPJ_doador_originario”列中的代码始终为整数且大小不同:14位,13位,11位或10位
“CPF_CNPJ_doador”中的代码示例:1256007000131,20566882000164,11459125000109,5746038000121 ...
我需要创建一个只有14位和13位代码的数据帧。请问,有没有人知道我如何只选择数据框“cand_doacoes”中“CPF_CNPJ_doador”列中的14位和13位代码?我需要先转换为字符串吗?
答案 0 :(得分:3)
如果你真的有代码的整数,那么应该快速的一种数学方法是将代码的基数10日志作为整数类型,并加1来计算数字位数。这可以是你的面具。
np.isin(np.log10(df.code_column.values).astype(int) + 1, [13, 14])
例如(借用Bharath的数据),
>>> df[np.isin(np.log10(df.num.values).astype(int) + 1, [13, 14])]
num
0 1256007000131
1 20566882000164
2 11459125000109
答案 1 :(得分:2)
使用while
和isin选择只有13位和14位数字的行的一种可能方式,即
astype(str).str.len()
答案 2 :(得分:2)
借用@Bharath的样本DF:
In [114]: df['num'].astype(str).str.match(r'\d{13,14}')
Out[114]:
0 True
1 True
2 True
3 False
4 False
Name: num, dtype: bool
In [115]: df[df['num'].astype(str).str.match(r'\d{13,14}')]
Out[115]:
num
0 1256007000131
1 20566882000164
2 11459125000109