如果它们不是第一行,有没有办法在csv中自动查找列名? 有问题的csv在文档顶部有一个非标题句子,然后是列名,然后是数据。我知道我可以尝试使用header = 1和skiprow = 0,但这预示着我知道顶行不是标题或csv数据的一部分。
我想要制作一个很难,因为大熊猫永远不知道什么是什么,什么不是标题?
答案 0 :(得分:1)
Pandas没有内置自动方式,但编写一个函数来计算要跳过的行并不太难。像下面这样的东西可以解决这个问题:
import pandas as pd
def calculate_skiprows(buffer, sep=','):
pos = buffer.tell()
lines = pd.DataFrame(buffer.readlines(10000))
buffer.seek(pos)
lines['columns'] = lines[0].apply(lambda row: row.count(sep))
return lines[lines['columns'] < lines['columns'].median()].index.values.tolist()
可能会遗漏一些边缘情况,因此您需要验证数据。另外,我写它是为了使用IO缓冲区,但你可以很容易地修改它以使用文件路径......或两者兼而有之。
示例用法如下:
from io import StringIO
WORDY_CSV = StringIO("""This is a CSV with a verbose intro paragraph.
The paragraph spans lines.
And a blank line seperates it with the header.
Date,Steps,Drinks,Hours Sleep
2018-02-01,9988,3,7.25
2018-02-02,12111,2,7.75
2018-02-03,11321,0,8.25
2018-02-04,9111,1,8.0
2018-02-05,9911,3,7.5
2018-02-06,10911,2,7.75
2018-02-07,12987,0,8.5
2018-02-08,7865,2,7.5
""")
wordy = pd.read_csv(WORDY_CSV, skiprows= calculate_skiprows(WORDY_CSV))
print(wordy)
#----------------------------------------------------------------------
# Date Steps Drinks Hours Sleep
# 0 2018-02-01 9988 3 7.25
# 1 2018-02-02 12111 2 7.75
# 2 2018-02-03 11321 0 8.25
# 3 2018-02-04 9111 1 8.00
# 4 2018-02-05 9911 3 7.50
# 5 2018-02-06 10911 2 7.75
# 6 2018-02-07 12987 0 8.50
# 7 2018-02-08 7865 2 7.50
答案 1 :(得分:1)
于2020年发现此问题。pandas.read_csv已改进。
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html
df = pandas.read_csv("blah.csv", skiprows=1)
值得一提的是其他的跳过选项,至少要记住它们存在。
skipinitialspace=False,
skiprows=None,
skipfooter=0,
skip_blank_lines=True,
我学到的最难的一课,并且习惯于维护:始终查看api文档。