Prefácio
Às vezes, encontraremos muitos desses dados, por exemplo, a primeira linha deste csv não é um nome de coluna como imaginamos. Dessa forma, quando processamos dados, haverá problemas, o primeiro é inconsistente.
Solução 1
Chame a biblioteca csv e reescreva o programa para ler o arquivo você mesmo.
A biblioteca csv é uma biblioteca que vem com o python.
Se os dados forem todos tipos de caracteres
Sob tais condições, o problema é muito simples, basta chamar o iterador de csv.reader () para lê-lo.
Se houver números nos dados, além de strings
Abaixo eu dou uma solução.
def float_test(data: str):
try:
return float(data)
except Exception:
return data
def read(filename):
"""
:param filename:
:return:
"""
values = []
with open(filename) as f:
r = csv.reader(f)
for row in r:
values.append(list(map(float_test, row)))
*data, label = list(map(list, zip(*values)))
return list(zip(*data)), label
Isso está relacionado a um artigo que escrevi antes, algoritmo de aprendizado de máquina [Algoritmo de Perceptron PLA] [leitura
em 5 minutos] No código acima, preciso ler o modelo para treinar o perceptron, mas encontrei os dados para mim Não há nome de coluna e não quero alterar os dados, então só tenho que encapsulá-los primeiro. Nestes
dados, exceto para a última coluna que pode ser um elemento, o resto são números de ponto flutuante. Então, chamei a função float_test aqui para fazer o teste.
As duas últimas linhas e o que acontece no retorno? Na verdade, quero separar a última coluna e restaurar as outras em uma matriz bidimensional. Cada linha é um teste X.
Solução 2
Configurando parâmetros! !
Consulte a explicação da API de read_csv fornecida por pandas :
https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_excel.html
Há uma frase mencionada:
-
cabeçalho : int ou lista de ints, padrão 'inferir'
- Número (s) de linha a usar como nomes de coluna e o início dos dados. O comportamento padrão é inferir os nomes das colunas: se nenhum nome for passado, o comportamento é idêntico a header = 0 e os nomes das colunas são inferidos da primeira linha do arquivo; se os nomes das colunas forem passados explicitamente, o comportamento é idêntico a header = None . Passe header = 0 explicitamente para poder substituir nomes existentes. O cabeçalho pode ser uma lista de inteiros que especificam as localizações das linhas para um índice múltiplo nas colunas, por exemplo [0,1,3]. As linhas intermediárias que não foram especificadas serão ignoradas (por exemplo, 2 neste exemplo é ignorado). Observe que este parâmetro ignora linhas comentadas e linhas vazias se skip_blank_lines = True, então header = 0 denota a primeira linha de dados em vez da primeira linha do arquivo.
-
nomes : tipo array, padrão Nenhum
- Lista de nomes de colunas a serem usados. Se o arquivo não contém nenhuma linha de cabeçalho, você deve passar explicitamente header = None. Duplicatas nesta lista farão com que um UserWarning seja emitido.
Quanto ao parâmetro de nomes , quando o arquivo não cobre o cabeçalho , então você precisa indicá-lo claramente no parâmetro de cabeçalho! !
Esta é a interpretação correta, então a operação correta é (** tomando um 1.csv
** arquivo como exemplo)
import pandas as pd
df = pd.read_csv('1.csv', header=None, names=['test'])
Então, esta coluna sem um nome de coluna será definida como a coluna de teste ~