Python 如何从格式不佳的CSV中提取数据帧
我有一堆格式怪异的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
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”,等等。