Панды читают CSV использовать разделитель в течение фиксированного промежутка времени - PullRequest
0 голосов
/ 09 ноября 2018

Предположим, у меня есть файл журнала, структурированный следующим образом для каждой строки:

$date $machine $task_name $loggedstuff

Я надеюсь прочитать все это с помощью pd.read_csv('blah.log', sep=r'\s+').Проблема в том, что $loggedstuff содержит пробелы, есть ли способ ограничить работу разделителя ровно 3 раза, чтобы все в loggedstuff отображалось в кадре данных как один столбец?

Я уже пытался использовать csv, чтобы проанализировать его как список списка и затем передать его в панд, но это медленно, мне интересно, есть ли более прямой способ сделать это.Спасибо!

Ответы [ 3 ]

0 голосов
/ 09 ноября 2018

Я думаю, что вы можете прочитать каждую строку csv-файла как одну строку, а затем преобразовать полученный фрейм данных в 3 столбца с помощью регулярного выражения.

df = pd.read_csv('./test.csv', sep='#', squeeze=True)
df = df.str.extract('([^\s]+)\s+([^\s]+)\s+(.+)')

, в котором вы можете изменить разделитель на тот, который не появился в документе.

0 голосов
/ 09 ноября 2018

При использовании expand=True элементы разбиения будут расширяться в отдельные столбцы.

Параметр n может использоваться для ограничения количества разбиений на выходе.

Подробности об этой же трости Из pandas.Series.str.split

Шаблон для использования

df.str.split (pat = None, n = -1, expand = False) развернуть: bool, по умолчанию False

Разбить разделенные строки на отдельные столбцы.

Если True, вернуть DataFrame / MultiIndex, расширяющую размерность.

Если False, вернуть Series / Index, содержащий списки строк

df.str.split(' ', n=3, expand=True)
0 голосов
/ 09 ноября 2018

Настройка

tmp.txt

a b c d
1 2 3 test1 test2 test3
1 2 3 test1 test2 test3 test4

Код

df = pd.read_csv('tmp.txt', sep='\n', header=None)
cols = df.loc[0].str.split(' ')[0]
df = df.drop(0)

def splitter(s):
    vals = s.iloc[0].split(' ')
    d = dict(zip(cols[:-1], vals))
    d[cols[-1]] = ' '.join(vals[len(cols) - 1: ])
    return pd.Series(d)

df.apply(splitter, axis=1)

возврат

   a  b  c                        d
1  1  2  3        test1 test2 test3
2  1  2  3  test1 test2 test3 test4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...