Загрузить набор данных из модифицированного CSV в пандах - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть файл данных, в котором хранятся данные, например:

key1:0.2164  key2:0.321  key3:0.1231
key1:0.3216  key2:0.149  key3:0.7894
...

Таким образом, в основном имена столбцов записываются в виде ключей.Строки разделены новыми строками в текстовом файле.Там нет комы.Я хотел бы превратить его в правильный фрейм данных, где columns=[key1,key2,key3]

Очевидно, что использования pd.read_csv(...,sep=':') недостаточно, так как я получаю значения, такие как key1:0.1231 в каждой ячейке, где это должно было быть 0.1231.

Я не уверен, должен ли я использовать специальное регулярное выражение в качестве разделителя или использовать другой метод для загрузки файла (поскольку это не настоящий .csv)

Ответы [ 3 ]

0 голосов
/ 25 сентября 2018

Вы можете использовать конвертеры для чтения файла.Вот как:

# read the columns names by loading one line and inferring the names from it
columns = pd.read_csv("filename", nrows=1, header=None, 
                      sep="\s+").values.tolist()[0]
columns = [c.split(":")[0] for c in columns]

# prepare the converters 
converters = {idx: lambda x: x.split(":")[1] for idx, _ in enumerate(columns)}

# read the whole file
df = pd.read_csv("filename", header=None, names=columns, sep="\s+", 
                 converters=converters)

вывод:

     key1   key2    key3
0  0.2164  0.321  0.1231
1  0.3216  0.149  0.7894

Более подробную информацию о преобразователях можно найти в документации pd.read_csv

0 голосов
/ 26 сентября 2018

Еще один способ сделать это:

df = pd.read_csv('filename',sep='\s+', names=['key1','key2','key3'])
for col in df.columns:
    df[col] = df[col].str.split(':').str[1].astype(float)
0 голосов
/ 25 сентября 2018

Часто более эффективно выполнять манипуляции до того, как данные попадают в ваш фрейм данных.Вот пример использования модуля csv:

import pandas as pd
import csv
from io import StringIO

x = StringIO("""key1:0.2164 key2:0.321 key3:0.1231 
key1:0.3216 key2:0.149 key3:0.7894 """)

# replace x with 'file.csv'
with x as fin:
    reader = csv.reader(fin, delimiter=' ')
    df = pd.DataFrame([dict(i.split(':') for i in filter(None, row)) for row in reader],
                      dtype=float)

Результат:

     key1   key2    key3
0  0.2164  0.321  0.1231
1  0.3216  0.149  0.7894

Логика работает, потому что конструктор pd.DataFrame принимает список словарей в качестве входных данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...