通过pandas处理csv文件

fcg9iug3  于 2023-04-28  发布在  其他
关注(0)|答案(2)|浏览(143)

这是我的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.")

我想标题名称为“顶部标题”,“下一级”列名称为属性,字段描述,表,列,过滤器
最后是数据。不知怎么的,Pandas看不懂第一行。

zzlelutf

zzlelutf1#

我不会直接使用Pandas来处理不同部分的缠结。你可以尝试类似下面的方法(假设你希望头文件名在一个列表中,所有数据在一个dataframe中):

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
4nkexdtk

4nkexdtk2#

“不知怎么的,Pandas看不懂第一行。”
必须指定列名列表。如果没有传递名称,则行为与header=0相同,并且从文件的第一行推断列名。
你可以尝试例如:

df = pd.read_csv('dd.csv', names=[1,2,3,4,5])

相关问题