#python #pandas #csv
Вопрос:
У меня есть текстовый документ со следующей структурой:
1:0.84722,0.52855;0.65268,0.24792;0.66525,0.46562
2:0.84722,0.52855;0.65231,0.24513;0.66482,0.46548
3:0.84722,0.52855;0.65197,0.24387;0.66467,0.46537
Первое число с двоеточием-это индекс, и я не знаю, как его указать, когда открываю файл. Действительно, я хотел бы стереть его.
Затем данные разделяются запятыми и точками с запятой, и я хотел бы, чтобы каждое число было в другом столбце, независимо от того, является ли разделитель запятой или точкой с запятой.
Как я мог это сделать?
Комментарии:
1. Что вы используете для чтения csv-файла?
2. Я использую pd.read_csv
Ответ №1:
Используйте следующее для загрузки csv с помощью pd.read_csv:
import pandas as pd
df = pd.read_csv("data.csv", # the file path, change it to your filename
sep="[,;:]", # the separator use a regular expression
engine="python", # need this to use regular expression as sep
usecols=range(1, 7), # use columns from [1, 7)
header=None # no header
)
print(df)
Выход
1 2 3 4 5 6
0 0.84722 0.52855 0.65268 0.24792 0.66525 0.46562
1 0.84722 0.52855 0.65231 0.24513 0.66482 0.46548
2 0.84722 0.52855 0.65197 0.24387 0.66467 0.46537
Примечание
Как только вы загрузите файл, я советую сохранить его (используя to_csv) как правильный csv-файл.
Ответ №2:
Поскольку вы уже используете pandas.read_csv, просто ознакомьтесь с его документацией для аргументации sep
:
Разделитель для использования. Если sep отсутствует, механизм C не может автоматически обнаружить разделитель, но механизм синтаксического анализа Python может, что означает, что последний будет использоваться и автоматически обнаружит разделитель с помощью встроенного средства поиска Python, csv.Sniffer. Кроме того, разделители длиной более 1 символа и отличные от «s » будут интерпретироваться как регулярные выражения, а также будут принудительно использовать механизм синтаксического анализа Python. Обратите внимание, что разделители регулярных выражений склонны игнорировать данные в кавычках. Пример регулярного выражения: ‘rt’.
Так что в вашем случае простого звонка pandas.read_csv(..., sep='[,;:]')
должно хватить.
Ответ №3:
Сначала загрузите его как обычный текст (без анализатора csv). Удалите весь нежелательный текст, колумс … Замените обычные запятые точками с запятой.
Чтобы удалить первое число, вы можете разделить строку на :
две части и оставить только вторую часть.
Чтобы заменить остальные, используйте replace(",", ";")
.
Теперь у вас есть хороший файл .csv, который вы можете сразу прочитать и проанализировать.
Ответ №4:
Для использования нескольких разделителей вы можете передать regex
шаблон, подобный :|,|;
тому, который в основном говорит о любом из них.
За то, что вы не используете первый столбец — вы можете указать столбцы с usecols
engine="python"
Спецификация необязательна, так как разделители длиной более 1 символа будут вынуждать использовать движок python.
x = '''1:0.84722,0.52855;0.65268,0.24792;0.66525,0.46562
2:0.84722,0.52855;0.65231,0.24513;0.66482,0.46548
3:0.84722,0.52855;0.65197,0.24387;0.66467,0.46537'''
xf = io.StringIO(x)
df = pd.read_csv(xf, sep=":|,|;", engine='python', header=None, usecols=list(range(1, 7)))
print(df)
# 1 2 3 4 5 6
#0 0.84722 0.52855 0.65268 0.24792 0.66525 0.46562
#1 0.84722 0.52855 0.65231 0.24513 0.66482 0.46548
#2 0.84722 0.52855 0.65197 0.24387 0.66467 0.46537