Это содержимое моего файла 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.")
Я хочу, чтобы имена заголовков были "Верхний заголовок", "Следующий уровень" Имена столбцов как атрибут, описание поля, таблица, столбец, фильтр
и, наконец, данные. Почему-то панды не могут прочитать первую строку.
«Почему-то панды не могут прочитать первую строку».
Вы должны назначить список имен столбцов. если имена не переданы, поведение идентично 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
«Почему-то панды не могут прочитать первую строку». Как насчет df = pd.read_csv('dd.csv', names=[1,2,3,4,5])?