这里是熊猫初学者,
我了解到pandas.read_csv
会自动假定第一列是标题列,如果不是这样,我应该传递一个标志header=None
。
现在,我有一个加载CSV的代码,该CSV有时具有标头,有时没有标头...是否有方法或标记read_csv
来尝试自动检测标头行?
如果一列(或几列)在除第一行外的所有行中都有数字-那么它是标题行,否则没有标题。
答案 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。
此后,您可以读取第一个条目(标题行),如果它与标题中期望的文本匹配,则您具有标题,否则就没有标题。