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

现在我有一个加载CSV的代码,它有时有标题,有时没有。有没有一种方法或一个标志来 read_csv 尝试自动检测标题行?

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

2 个评论
根据你的最后一句话,你可以抓取每个csv的第一行,检查逻辑并相应地设置 header
我可以,出于某种原因,我以为pandas在某个地方内置了这个功能。
python
pandas
Yossi Vainshtein
Yossi Vainshtein
发布于 2018-11-01
3 个回答
kuropan
kuropan
发布于 2021-12-23
已采纳
0 人赞同

好吧,那么快速(而且可能很脆弱)的想法。

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文件的前nrows(默认为20)行。一次是带标题的,一次是不带标题的。然后我们看看pandas给每一列分配了什么数据类型。如果数据类型在忽略第一行时没有变化,那么就没有页眉(当然,这只适用于至少有一列的页眉是字符串,但所有其他条目都是另一种非字符串的数据类型,例如所有的浮点数)。

我喜欢你的方案,会尝试的 (我认为你应该先声明 df = pd.DataFrame... 然后再进行,但没关系,我有这个想法)
哦,对了,这些语句的顺序是错的。我更新了它;)
SA12345
SA12345
发布于 2021-12-23
0 人赞同

你可以使用

str 包含

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

这将根据列条目是否包含你要找的东西返回一个真/假。

Thereafter, you may read off the first entry (for your header row),和if it matches the text you expect in your header, then you have a header, else you don't have a header.

我事先不知道列名,这个模块可以用于不同的数据文件...
agsalguero
agsalguero
发布于 2021-12-23
0 人赞同

当数据框架没有标题时,其 Dataframe.columns 属性采用数字索引。否则,它使用字符串。所以,只要检查第一列标签的类型即可。

import pandas as pd
import io
def has_header(df):
    return isinstance(df.columns[0], str)
csv=u"""col1,col2,col3
5,2,7
4,9,6
7,3,1"""
df1 = pd.read_csv(io.StringIO(csv))
print(df1.head())
if has_header(df1):
    print("Dataframe 1 has header")
else:
    print("Dataframe 1 doesn't have header")
csv=u"""5,2,7
4,9,6
7,3,1"""
df2 = pd.read_csv(io.StringIO(csv), header=None)
print(df2.head())
if has_header(df2):
    print("Dataframe 2 has header")
else:
    print("Dataframe 2 doesn't have header")
df3= pd.read_csv(io.StringIO(csv))
print(df3.head())
if has_header(df3):
    print("Dataframe 3 has header")
else:
    print("Dataframe 3 doesn't have header")
df4 = pd.read_csv(io.StringIO(csv), header='infer')
print(df4.head())
if has_header(df4):
    print("Dataframe 4 has header")
else:
    print("Dataframe 4 doesn't have header")

以下是上述代码产生的输出。

   col1  col2  col3
0     5     2     7
1     4     9     6
2     7     3     1
Dataframe 1 has header
   0  1  2
0  5  2  7
1  4  9  6
2  7  3  1
Dataframe 2 doesn't have header
   5  2  7
0  4  9  6
1  7  3  1
Dataframe 3 has header
   5  2  7