Python 熊猫读取_csv时不知道是否存在标头
我有一个包含已知列的输入文件,比如两列Python 熊猫读取_csv时不知道是否存在标头,python,csv,pandas,Python,Csv,Pandas,我有一个包含已知列的输入文件,比如两列Name和Sex。有时它有标题行Name,Sex,有时它没有: 1.csv: Name,Sex John,M Leslie,F John,M Leslie,F 2.csv: Name,Sex John,M Leslie,F John,M Leslie,F 事先知道列的标识,是否有一种好方法可以使用相同的read\u csv命令处理这两种情况?基本上,我想指定names=['Name','Sex'],然后让它仅在头存在时推断header=0。我能想到的
Name
和Sex
。有时它有标题行Name,Sex
,有时它没有:
1.csv:
Name,Sex
John,M
Leslie,F
John,M
Leslie,F
2.csv:
Name,Sex
John,M
Leslie,F
John,M
Leslie,F
事先知道列的标识,是否有一种好方法可以使用相同的read\u csv
命令处理这两种情况?基本上,我想指定names=['Name','Sex']
,然后让它仅在头存在时推断header=0
。我能想到的最好办法是:
- 1) 在执行读取csv之前读取文件的第一行,然后设置 参数适当
- 2) 只需执行
, 然后检查第零行是否与标题相同,如果 所以放下它(然后可能需要对行重新编号)df=pd.read\u csv(输入文件,名称=['Name','Sex'))
read\u csv
来实现这一点?使用新功能-:
使用方法:
我不确定这是否是最优雅的方式,但这也应该适用:
df = pd.read_csv(filename, header=None, names=cols)
if (df.iloc[0] == cols).all():
df = df[1:].reset_index(drop=True)
我想出了一种在事先不知道标题名称的情况下检测标题的方法:
如果有(df.iloc[0]。应用(lambda x:isinstance(x,str)):
df=df[1:]重置索引(drop=True)
通过稍微更改,它可以使用检测到的标题更新当前标题:
如果有(df.iloc[0]。应用(lambda x:isinstance(x,str)):
df=df[1:]。重置索引(drop=True)。重命名(columns=df.iloc[0])
这将允许轻松选择所需的行为:
update_header=True
如果有(df.iloc[0].apply(lambda x:isinstance(x,str)):
新的_头=df.iloc[0]
df=df[1:]重置索引(drop=True)
如果更新\u头:
重命名(列=new_头,inplace=True)
优点:
- 不需要事先知道标题的名称
- 可用于在检测到现有标题时自动更新标题
- 如果数据包含字符串,则无法正常工作。替换
以要求所有元素都是字符串可能会有所帮助,除非数据还包含整行字符串if any()