Разрешить дублирование столбцов в пандах - PullRequest
0 голосов
/ 29 апреля 2018

Я делю большой файл CSV (содержащий финансовые данные о запасах) на более мелкие куски. Формат файла CSV отличается. Что-то вроде сводной таблицы Excel. Первые несколько строк первого столбца содержат несколько заголовков.

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

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

В любом случае, я пытаюсь разрешить Пандам разрешать дублирование заголовков столбцов, а не добавлять «.1», «.2», «.3» и т. Д. После заголовков. Я знаю, что Pandas изначально этого не разрешает, есть ли обходной путь? Я попытался установить header = None в read_csv, но он выдает ошибку токенизации, которая, я думаю, имеет смысл. Я просто не могу придумать легкий путь.

enter image description here

import pandas as pd

csv_path = "C:\\Users\\ThirdHandBD\\Desktop\\Data Splitting\\pd-split\\chunk4.csv"

#df = pd.read_csv(csv_path, header=1, dtype='unicode', sep=';', low_memory=False, error_bad_lines=False)
df = pd.read_csv(csv_path, header = 1, dtype='unicode', sep=';', index_col=False)
print("I read in a dataframe with {} columns and {} rows.".format(
len(df.columns), len(df)
))

filename = 1

#column increment
x = 30 * 59

for column in df:
    loc = df.columns.get_loc(column)
    if loc == (x * filename) + 1:
        y = filename - 1
        a = (x * y) + 1
        b = (x * filename) + 1
        date_df = df.iloc[:, :1]
        out_df = df.iloc[:, a:b]
        final_df = pd.concat([date_df, out_df], axis=1, join='inner')
        out_path = "C:\\Users\\ThirdHandBD\\Desktop\\Data Splitting\\pd-split\\chunk4-part" + str(filename) + ".csv"
        final_df.to_csv(out_path, index=False)
        #out_df.to_csv(out_path)
        filename += 1

# This should be the same as df, but with only the first column.
# Check it with similar code to above.

EDIT:

С, https://github.com/pandas-dev/pandas/issues/19383, Я добавляю:

        final_df.columns = final_df.iloc[0]
        final_df = final_df.reindex(final_df.index.drop(0)).reset_index(drop=True)

Итак, полный код:

import pandas as pd

csv_path = "C:\\Users\\ThirdHandBD\\Desktop\\Data Splitting\\pd-split\\chunk4.csv"

#df = pd.read_csv(csv_path, header=1, dtype='unicode', sep=';', low_memory=False, error_bad_lines=False)
df = pd.read_csv(csv_path, header = 1, dtype='unicode', sep=';', index_col=False)
print("I read in a dataframe with {} columns and {} rows.".format(
len(df.columns), len(df)
))

filename = 1

#column increment
x = 30 * 59

for column in df:
    loc = df.columns.get_loc(column)
    if loc == (x * filename) + 1:
        y = filename - 1
        a = (x * y) + 1
        b = (x * filename) + 1
        date_df = df.iloc[:, :1]
        out_df = df.iloc[:, a:b]
        final_df = pd.concat([date_df, out_df], axis=1, join='inner')
        out_path = "C:\\Users\\ThirdHandBD\\Desktop\\Data Splitting\\pd-split\\chunk4-part" + str(filename) + ".csv"
        final_df.columns = final_df.iloc[0]
        final_df = final_df.reindex(final_df.index.drop(0)).reset_index(drop=True)
        final_df.to_csv(out_path, index=False)
        #out_df.to_csv(out_path)
        filename += 1

# This should be the same as df, but with only the first column.
# Check it with similar code to above.

Теперь весь первый ряд пропал. Но ожидаемый вывод для строки заголовка должен быть заменен индексом сброса, без ".1", ".2" и т. Д.

Скриншот:

Строка SimFin ID больше не существует.

enter image description here

1 Ответ

0 голосов
/ 15 мая 2018

Вот как я это сделал:

    final_df.columns = final_df.columns.str.split('.').str[0]

Ссылка: https://pandas.pydata.org/pandas-docs/stable/text.html

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