Обработка файла csv через pandas

Это содержимое моего файла csv

1.1.1.Top Header

Attribute,Field Description,Table,Column, Filter

Quarter,Fiscal Current Quarter,tableA,col1,A=B

Blah, Blah, Blah, Blah, Blah

Blah, Blah, Blah, Blah, Blah

Blah, Blah, Blah, Blah, Blah

1.1.2.Next Level

Attribute,Field Description,Table,Column, Filter

Blah, Blah, Blah, Blah, Blah

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

import pandas as pd

# Load the CSV file
df = pd.read_csv('dd.csv')

# Fill NaN values with "NA"
df = df.fillna("NA")

# Find the row indexes of the header rows
header_indexes = df[df.iloc[:,0].str.match(r'^(\d+\.)+\d+\..*')].index.tolist()

# Check if there are any headers and data rows
if header_indexes and header_indexes[-1] < len(df) - 1:
    # Extract header names and remove the numeric values
    header_names = [df.iloc[i,0].split('.')[1:] for i in header_indexes]
    header_names = [', '.join([h.strip() for h in header]) for header in header_names]
    
    # Extract the column names
    column_names = df.iloc[header_indexes[-1]+1,:].tolist()
    
    print("Header Names:", header_names)
    print("Column Names:", column_names)
else:
    print("No headers or data rows found in the CSV file.")

Я хочу, чтобы имена заголовков были "Верхний заголовок", "Следующий уровень" Имена столбцов как атрибут, описание поля, таблица, столбец, фильтр

и, наконец, данные. Почему-то панды не могут прочитать первую строку.

«Почему-то панды не могут прочитать первую строку». Как насчет df = pd.read_csv('dd.csv', names=[1,2,3,4,5])?

Evgeny Romensky 19.04.2023 10:22
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
69
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

«Почему-то панды не могут прочитать первую строку».

Вы должны назначить список имен столбцов. если имена не переданы, поведение идентично header=0, а имена столбцов выводятся из первой строки файла.

Итак, вы можете попробовать, например:

df = pd.read_csv('dd.csv', names=[1,2,3,4,5]) 
Ответ принят как подходящий

Я бы не стал использовать Pandas напрямую для распутывания различных частей. Вместо этого вы можете попробовать что-то вроде следующего (предполагается, что вам нужны имена заголовков в списке и все данные в одном кадре данных):

import re
from io import StringIO

re_header = re.compile(r"^(?:\d+\.)+\d*(.*)$")
header_names, data_strings = [], []
with open("dd.csv", "r") as file:
    for line in file:
        if match := re_header.match(line):
            header_names.append(match.group(1))
            data_strings.append("")
        else:
            data_strings[-1] += line
dfs = (pd.read_csv(StringIO(string)) for string in data_strings)
df = pd.concat(dfs, ignore_index=True).fillna("NA")

Результат для образца:

  • header_names: ['Top Header', 'Next Level']

  • df:

       Attribute       Field Description   Table Column  Filter
    0   Quarter  Fiscal Current Quarter  tableA   col1     A=B
    1      Blah                    Blah    Blah   Blah    Blah
    2      Blah                    Blah    Blah   Blah    Blah
    3      Blah                    Blah    Blah   Blah    Blah
    4      Blah                    Blah    Blah   Blah    Blah
    

Другие вопросы по теме