Как импортировать список dtypes из файла CSV? - PullRequest
0 голосов
/ 14 января 2020

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

Пример :

dtypes = [{"ID": str, "Place": str, "Speed":float, "Major Street": str},
          {"ID": str, "Place": str, "Speed":float, "Roy's Boulevard": str},
          {"ID": str, "Place": str, "Speed":float, "Cassandra Park": str}]

Я бы предпочел иметь этот массив в другом файле, чтобы потом не загромождать мой код огромным массивом. Должен ли я иметь это в отдельном python файле, который я импортирую, или есть способ разделить / вырезать из CSV?

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

https://pastebin.com/vW98iC3K

Дополнительный код, чтобы показать, что я пытаюсь выполнить sh с этим словарем:

  for n in tq(range(4)):
      df = pd.read_csv(r'S:\Energy\'+ meterfile[n] + '.csv', parse_dates=[['Date', 'Time']], skiprows=[1], usecols=dictionary[n])
              first_nan = df[df.Date_Time == 'nan nan'].first_valid_index()
              df = df[:first_nan]
              df.fillna(0)
              df = df.astype(dtypes[n])




              df.to_csv(r'S:\Energy\Database Progress\CleanedWorksheets\\' +
              meterfile[n] + '.csv', index=False)

1 Ответ

0 голосов
/ 14 января 2020

Опции:

1 Считайте CSV по умолчанию, исправьте dtypes после

, т.е. не указывайте dtypes, они по умолчанию будут иметь строковое значение. Затем исправьте нестроковые столбцы после (у вас есть только 'Speed': float в вашем примере).

import pandas as pd
df = pd.read_csv(..., dtype = {'ID': 'object', 'Place': 'object', 'Speed': float}, ...)

# Then fix up any dtype after the read:
df['misread_col'] = df['misread_col'].astype(...)

См. do c на dtype

ИЛИ:

2 Заранее программно выяснить, каким должен быть тип dtype для каждого столбца.

Укажите тип dtype для каждого столбца во время чтения: pd.read_csv(... dtype={...} ...), как значение 'name': dtype. , Это потребует от вас заранее знать имена столбцов (или, возможно, использовать регулярные выражения для назначения dtypes на основе имени). И чтобы сделать это программно, вам, вероятно, придется сначала прочитать строку заголовка каждого файла CSV и сопоставить его с dtypes.

И если вы хотите программно прочитать строку заголовка каждого CSV файл и сопоставьте его с dtypes:

import glob

for f in glob.glob('*.csv'):
    # First, read header row, to infer dtypes
    df = pd.read_csv(f, header=[0])
    #print(df.columns)
    # Here you can process df.columns, add it into a dtype_dict, whatever

    # Second, reread entire file
    df = pd.read_csv(f, dtype=...)

Честно говоря, выполнение 1) может быть менее печальным, чем 2), это зависит. Просто прочитайте все, настройте спецификаторы dtypes, запустите его снова. Если вы отлаживаете это, просто прочитайте, скажем, nrow=100.

...