Как читать в файле CSV, в котором есть список значений столбцов списка с определенными строками, имеющими двойные кавычки в виде строк - PullRequest
0 голосов
/ 26 ноября 2018

В прикрепленном файле csv есть 4 столбца с полем индекса.

Четвертый столбец - это список столбцов списка.Записи с одним элементом представлены в виде списка [13455], а записи с несколькими элементами представлены как «[13764,13455,13456]».

Я хочу удалить двойные кавычки и прочитать последний столбец каксписок только из списка.Пожалуйста, предложите мне, как это сделать.

Я также пытаюсь найти максимальное значение из всего списка списка.

В этом примере я пытаюсь найти 20930, что является максимальным значением. Образец изображения файла здесь

full_data1 = pd.DataFrame([]) 
   for gm_chunk1 in tqdm_notebook(pd.read_csv('CD_1000.csv',skipinitialspace = True, sep = ',', quotechar='"', usecols = ['ID','NBR','Day','CD'], chunksize=10000)):
      gm_chunk1 = gm_chunk1['CD'].apply(lambda x: x.strip('"'))
      gm_chunk1 = gm_chunk1.groupby(['ID'],as_index=False).agg(lambda x: list(x))
      full_data1 = full_data1.append(gm_chunk1)
      print(len(full_data1))
      print (50*'--')

Данные содержат около 150 миллионов записей.Я также пытаюсь сделать групповой на основе ID.Похоже, группа работает нормально.Но потом я понял, что последний столбец стал всеми символами, а не списком списка.

Ответы [ 2 ]

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

В вашем случае одной из проблем является quotechar='"' с sep = ','.Без первого , в вашем списке будет использоваться как разделитель, и pandas выдаст ошибку.Это прекрасно работает с другим разделителем.

Использование pandas:

import pandas as pd
import io
import ast

dframe=u"""0|123|[1]
1|234|"[2,3,4]"
2|345|"[3,4,5]" """

df = pd.read_csv(io.StringIO(dframe), sep='|', header=None)

# The actual solution to apply to the right column
df[2] = df[2].map(lambda x: ast.literal_eval(x))
print(df)

Результат

   0    1          2
0  0  123  [1, 2, 3]
1  1  234  [2, 3, 4]
2  2  345  [3, 4, 5]

Третий столбец - это список, который вы можете повторять.

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

Вот возможное решение, которое может быть применено к соответствующему столбцу после того, как DataFrame был создан из CSV:

# Example dataframe:
df = pd.DataFrame(data={"col":[[13455], "[13764,13455,13456]"]})

# Solution
def convert_str(x):
    if isinstance(x, str):
        return eval(x)
    else:
        return x
df["col"] = df["col"].apply(lambda x:convert_str(x))

Чтобы получить максимум списка списков, вы можете использовать это:

max(df["col"].apply(lambda l: max(l)))

Или альтернатива, использующая понимание списка:

max([max(l) for l in df["col"]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...