Можно ли проанализировать столбцы CSV, содержащие массивы с векторизованным Pandas кодом? - PullRequest
0 голосов
/ 04 февраля 2020

Следующий код генерирует CSV и затем анализирует его снова. Столбец b содержит массив целых чисел для каждого поля.

import pandas as pd
from io import StringIO
import numpy as np


# Create CSV
df = pd.DataFrame(dict(
    a=[1,2,3],
    b=[[1], [1,2], [1,2,3]]
))
s = df.to_csv()

# ,a,b
# 0,1,[1]
# 1,2,"[1, 2]"
# 2,3,"[1, 2, 3]"

def parse(s):
    return np.fromstring(s[1:-1], sep=", ", dtype=int)

df2 = pd.read_csv(StringIO(s), converters=dict(b=parse))

Вопрос теперь в том, можно ли векторизовать / ускорить анализ. Я подозреваю, что это могло бы быть возможно, указав dtype для столбца b, но я не мог понять, что это будет за dtype.

Есть предложения?

1 Ответ

0 голосов
/ 05 февраля 2020

Этот конвертер работает? Тогда я бы предложил придерживаться этого.

Исходный DF имеет столбец типа dtype, содержащий списки различного размера. Сохранение записывает версию этих списков str. Ваш преобразователь создает массив

In [155]: np.fromstring("[1,2,3]"[1:-1], sep=", ", dtype=int)                                  
Out[155]: array([1, 2, 3])

eval (или «более безопасный» ast эквивалент) создает список:

In [156]: eval("[1, 2, 3]")                                                                    
Out[156]: [1, 2, 3]

Остерегайтесь, если у оригинала вместо массивов были массивы списки, строка не будет работать так же хорошо.

In [157]: str(_155)                                                                            
Out[157]: '[1 2 3]'

Отсутствует удобная запятая. И что еще хуже, он может содержать ..., если массив достаточно большой.

Это часто встречается, часто потому, что люди непреднамеренно сохраняют фрейм с этими элементами списка или массива. До сих пор я не видел симпатичной альтернативы - по крайней мере, если вам нужен читабельный csv.

В какой-то степени кадр данных с элементами списка или массива является аберрацией. Столбец dtype будет объектным, и быстрые numpy операции невозможны. Но pandas также использует объект dtype для строк.

Также со списками разной длины вы не можете создать массив nd. Это может быть только список или массив dtype объекта. Скорость вычисления массива чисел c исчезла.

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