熊猫新手在这里,
我读到pandas.read_csv
自动假设第一列是标题列,如果不是这样,我应该传递一个标志header=None
。
现在我有一个加载CSV的代码,CSV有时有头,有时没有……有没有一种方法或标志可以让read_csv
尝试并自动检测标题行?
如果一列(或几列)在除第一行以外的所有行中都有数字,则它是标题行,否则没有标题。
发布于 2018-11-01 12:21:47
好的,这么快(可能也很脆弱)的想法:
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文件的前n行(默认为20行)。一次有标题,一次没有标题。然后我们来看一下pandas为每一列分配了什么数据类型。如果忽略第一行时数据类型没有改变,那么就没有头(当然,只有当你总是至少有一列的头是字符串,但所有其他条目都不是字符串的数据类型,例如所有的浮点数)。
发布于 2018-11-01 12:20:43
您可以使用
字符串和包含
df['column_name'].str.contains('text_you_are_expecting_in_header')
这将根据列条目是否包含您要查找的内容返回True/False。
然后,您可以读出第一个条目(用于标题行),如果它与您在标题中预期的文本相匹配,那么您就有了标题,否则就没有标题。
发布于 2021-12-23 02:03:20
当数据帧没有报头时,它的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
0 4 9 6
1 7 3 1
Dataframe 4 has header
请注意,在使用pd.read_csv
创建Dataframe
时,必须显式设置header=None
。否则,将从文件的第一行推断列名(请参见pasntas.read_csv)。
https://stackoverflow.com/questions/53100598
复制相似问题