熊猫可以自动识别是否存在标头

时间:2018-11-01 11:42:07

标签: python pandas

这里是熊猫初学者,

我了解到pandas.read_csv会自动假定第一列是标题列,如果不是这样,我应该传递一个标志header=None

现在,我有一个加载CSV的代码,该CSV有时具有标头,有时没有标头...是否有方法或标记read_csv来尝试自动检测标头行?

如果一列(或几列)在除第一行外的所有行中都有数字-那么它是标题行,否则没有标题。

2 个答案:

答案 0 :(得分:1)

好吧,这么快(可能还很脆弱)的想法:

import pandas as pd

df = pd.DataFrame(columns=["ints_only", "strings_only"],
                  data=[[1,"a"], [3,"b"]])

df.to_csv("header.csv")
df.to_csv("noheader.csv", header=None)


def has_header(file, nrows=20):
    df = pd.read_csv(file, header=None, nrows=nrows)
    df_header = pd.read_csv(file, nrows=nrows)
    return tuple(df.dtypes) != tuple(df_header.dtypes)


has_header("header.csv")    # gives True
has_header("noheader.csv")  # gives False

这是怎么回事?

我们读取了csv文件的前几行(默认为20行)。一次带标题,一次不带标题。然后,我们看一下pandas分配给每一列的数据类型。如果忽略第一行时数据类型没有变化,那么就没有标题(当然,只有当您总是至少有一个标题为字符串的列,而所有其他条目都是其他不是该类型的数据类型时,标题才有效)字符串,例如所有浮点数。

答案 1 :(得分:0)

您可以使用

str 包含

df['column_name'].str.contains('text_you_are_expecting_in_header')

这将根据列条目是否包含您要查找的内容返回True / False。

此后,您可以读取第一个条目(标题行),如果它与标题中期望的文本匹配,则您具有标题,否则就没有标题。