Pandas iloc не возвращает срез данных - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь разбить CSV-файл, содержащий данные о запасах более 1500 компаний.Первый столбец содержит даты, а последующие столбцы содержат данные о компании.

Когда я использую функцию iloc , чтобы разделить файл CSV на более мелкие файлы, содержащие меньшие столбцы, он создает еще больший файл.

Вот как выглядят данные.

enter image description here

import pandas as pd

csv_path = "new-data.csv"
filename = 1
out_path = "C:\\Users\\ThirdHandBD\\Desktop\\Data Splitting\\pd-split\\" + str(filename) + ".csv"

#column increment
x = 30 * 59

'''for index, row in df.itertuples():
    if index == ((x * filename) + 1):
        pd.read_csv(csv_path).iloc[:, :index].to_csv(out_path)
        filename += 1'''

pd.read_csv(csv_path, skiprows = 1, dtype='unicode').iloc[:, :1].to_csv(out_path)

Новый файл больше оригинала.

enter image description here

Не выдается никаких ошибок, dtype установлен в Unicode, чтобы обойти ошибку низкой памяти.Размер файла составляет около 300 МБ, и аналогичные dtypes работали для других с аналогичными размерами файлов.Skiprows установлен в 1, потому что первая строка пуста.

Что я делаю не так?

РЕДАКТИРОВАТЬ:

enter image description here

Так выглядят новые данные.Он добавляет кучу запятых, а остальные данные совпадают.Как мне это исправить?

РЕДАКТИРОВАТЬ x 2:

После того, как я учел предложение могучей кучи, я избавился от всего, кроме заголовков в строке 6, и вырубилна строках с помощью текстового редактора.Затем я запускаю следующий код.

import pandas as pd

csv_path = "C:\\Users\\ThirdHandBD\\Desktop\\Data Splitting\\pd-split\\small-data.csv"
out_path = "C:\\Users\\ThirdHandBD\\Desktop\\Data Splitting\\pd-split\\1.csv"

df = pd.read_csv(csv_path, header=0, dtype='unicode')
print("I read in a dataframe with {} columns and {} rows.".format(
len(df.columns), len(df)
))

out_df = df.iloc[:, :1]
out_df.to_csv(out_path)
# This should be the same as df, but with only the first column.
# Check it with similar code to above.

РЕЗУЛЬТАТ

Я читаю в кадре данных с 1546 столбцами и 13 строками.

enter image description here

Вырезает только случайное количество заголовков столбцов.Когда я запустил код первого и последнего столбца mightypile, я получил случайные заголовки.Мой CSV не читается правильно, и я не понимаю, почему.

print("The first and last columns are:")
print(df.head(1))
print(df.tail(1))

TERMINAL OUT:

enter image description here

Один и тот же выход терминала повторяется и включается.Извините за то, что я глупый человек, но я чувствую, что я иду назад, а не прогрессирую.

1 Ответ

0 голосов
/ 26 апреля 2018

Есть несколько проблем.Ваш входной CSV имеет совершенно другое форматирование из строк 0-5, чем в 6-и.Первые 6 строк не структурированы как DataFrame со строками и столбцами.Если вам нужны эти данные, вам может потребоваться написать собственный код для их извлечения.

Вторым предложением будет использование текстового редактора (Google для предложений, но это НЕ Word, Excel или Writepad)чтобы сохранить меньшую часть ваших данных для экспериментов.Попытка выяснить, как читать файлы CSV с монстром в 300 МБ, причинит вам много боли и зря потратит время.

Начиная с 6, у вас есть то, что на ваших частичных изображениях выглядит более DataFrame-например, с заголовками столбцов в строке 6 и данными за этим.Но невозможно сказать, сколько столбцов там из вашего изображения.Итак, во-первых, проигнорируйте более сложные структуры в верхней части файла и посмотрите, сможете ли вы выяснить, что вы читаете из остальной части одного файла, и пишете ли вы то, что вы думаете.После того, как вы наберете свой подход к одному файлу, вы можете начать итерировать больше.

import pandas as pd

csv_path = "new-data.csv"
out_path = "C:\\Users\\ThirdHandBD\\Desktop\\Data Splitting\\pd-split\\1.csv"

df = pd.read_csv(csv_path, header=6, dtype='unicode')
print("I read in a dataframe with {} columns and {} rows.".format(
    len(df), len(df.columns)
))
print("The first 4 and last 4 columns are:")
print(df.head(4))
print(df.tail(4))

out_df = df.iloc[:, :1]
# This should be the same as df, but with only the first column.
# Check it with similar code to above.

Если ваши строки все еще слишком велики для визуализации с помощью функций .head () и .tail (), яеще раз призываю вас начать с «игрушечного» набора данных, чтобы вы могли получить представление о том, что код делает для вас.Это сложно и сложно с большими данными.

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