python - 如何从格式不佳的 CSV 中提取数据框
问题描述
我有一堆格式奇怪的 CSV,我需要从中提取一些数据并将其放入数据框中。当我使用 读取文件时df = pd.read_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
推荐阅读
- weka - 每次点击后,WEKA 都会冻结
- flutter - 在 Flutter 的流构建器中使用 Future 构建器是正确的
- linux - Docker 不会将文件从容器复制到主机的 /tmp 文件夹
- amazon-web-services - 使用 Cloud Formation 从 Lambda 获取价值并检查分支的条件
- sql - 在 SSRS 中显示数据源
- redis - 如何获取带前缀的 Redis 键中的数据/值大小?
- javascript - 为什么谷歌地图在两点之间显示错误的持续时间?
- python - 只杀死 chromedriver 实例,在运行 python 脚本而不是其他脚本时启动
- regex - 给定文本。把它分解成文字。通过溪流
- python - 奇怪的类型错误:函数返回 None 或没有返回语句结束