Python 如何从格式不佳的CSV中提取数据帧

Python 如何从格式不佳的CSV中提取数据帧,python,pandas,csv,dataframe,Python,Pandas,Csv,Dataframe,我有一堆格式怪异的CSV,我需要从中提取一些数据并将其放入数据帧中。当我使用df=pd.read\u csv(file)按原样读取文件时,它看起来像: A B C D E 0 Account 1 111 20 10 12.0 1 Account 2 222 30 15 NaN 2 Account 3 333 40 25 NaN 3

我有一堆格式怪异的CSV,我需要从中提取一些数据并将其放入数据帧中。当我使用
df=pd.read\u csv(file)
按原样读取文件时,它看起来像:

            A       B       C      D     E
0   Account 1     111      20     10  12.0
1   Account 2     222      30     15   NaN
2   Account 3     333      40     25   NaN
3         NaN     NaN     NaN    NaN   NaN
4     Company    Name  Number  Price   NaN
5         AAA  AA Inc      15    100   NaN
6         NaN     NaN     NaN    NaN   NaN
7     Company     NaN     NaN    NaN   NaN
8          BB  BB Inc       5     20   NaN
9          CC  CC Inc      20     50   NaN
10         AA  AA Inc      12    100   NaN
但是有很多数据是不需要的,因为我希望输出看起来像:

    Company    Name  Number  Price
0        AA  AA Inc      15    100
1        BB  BB Inc       5     20
2        CC  CC Inc      20     50
3        AA  AA Inc      12    100
我不能使用索引,因为有多个CSV,并且所需的数据并不总是从同一行开始,所以程序需要相当灵活。我知道我可以编写一系列带有特殊规则的函数,但这似乎容易出错,而且很乏味

那么,有没有一种优雅的方法可以做到这一点呢

代码:

import pandas as pd
import numpy as np


data_string = '''Account 1,111,20,10,12.0
Account 2,222,30,15,NaN
Account 3,333,40,25,NaN
NaN,NaN,NaN,NaN,NaN
Company,Name,Number,Price,NaN
AAA,AA Inc,15,100,NaN
NaN,NaN,NaN,NaN,NaN
Company,NaN,NaN,NaN,NaN
BB,BB Inc,5,20,NaN
CC,CC Inc,20,50,NaN
AA,AA Inc,12,100,NaN'''

df = pd.DataFrame(
    [x.split(',') for x in data_string.split('\n')],
    columns=list('ABCDE')).replace('NaN', np.nan)
print(df, '\n\n----\n')

first_row = df['A'].to_list().index('Company')
df = df.iloc[first_row:, :4]
df.columns = df.iloc[0].values
df = df.drop(df.index[0])
df = df[df['Company'] != 'Company'].dropna().reset_index(drop=True)
print(df)
输出:

            A       B       C      D     E
0   Account 1     111      20     10  12.0
1   Account 2     222      30     15   NaN
2   Account 3     333      40     25   NaN
3         NaN     NaN     NaN    NaN   NaN
4     Company    Name  Number  Price   NaN
5         AAA  AA Inc      15    100   NaN
6         NaN     NaN     NaN    NaN   NaN
7     Company     NaN     NaN    NaN   NaN
8          BB  BB Inc       5     20   NaN
9          CC  CC Inc      20     50   NaN
10         AA  AA Inc      12    100   NaN

----

  Company    Name Number Price
0     AAA  AA Inc     15   100
1      BB  BB Inc      5    20
2      CC  CC Inc     20    50
3      AA  AA Inc     12   100

你能用Excel做校准工作吗?如果这是一个一次性的解决方案,这可能是最好的。如果你需要对许多不同的CSV文件执行多次此操作,你可能希望使用“乏味”版本,也许可以为每个文件绘制标题。我不想在Excel中执行此操作,但听起来好像我没有太多的选项。对于你想要的行,列“Name”总是“Inc”吗?如果是,那么这应该只是过滤器usageNo,我认为标记错误地格式化了“Name”列,值是“AA Inc”,“BB Inc”,等等。