pandas读csv,其中csv的列名在第二行?

时间:2018-01-28 01:21:17

标签: pandas

如果它们不是第一行,有没有办法在csv中自动查找列名? 有问题的csv在文档顶部有一个非标题句子,然后是列名,然后是数据。我知道我可以尝试使用header = 1和skiprow = 0,但这预示着我知道顶行不是标题或csv数据的一部分。

我想要制作一个很难,因为大熊猫永远不知道什么是什么,什么不是标题?

2 个答案:

答案 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文档。