我有一个包含已知列的输入文件,让我们说两列Name和Sex.有时它有标题行Name,Sex,有时它不会:
1.csv:
Name,Sex
John,M
Leslie,F
Run Code Online (Sandbox Code Playgroud)
2.csv:
John,M
Leslie,F
Run Code Online (Sandbox Code Playgroud)
事先了解了列的身份,是否有一种很好的方法可以使用相同的read_csv命令处理这两种情况?基本上,我想指定names=['Name', 'Sex'],然后header=0只在标题存在时推断它.我能想出的最好的是:
1)在执行之前读取文件的第一行read_csv,并适当地设置参数.
2)只需这样做df = pd.read_csv(input_file, names=['Name', 'Sex']),然后检查零行是否与标题相同,如果是,则删除它(然后可能必须重新编号行).
但这对我来说似乎并不像用例那么不寻常.是否有一种内置的方式来做这个read_csv我没有想到的?
使用新功能 - 通过可调用选择:
cols = ['Name','Sex']
df = (pd.read_csv(filename, header=None, names=cols)
[lambda x: np.ones(len(x)).astype(bool)
if (x.iloc[0] != cols).all()
else np.concatenate([[False], np.ones(len(x)-1).astype(bool)])]
)
Run Code Online (Sandbox Code Playgroud)
使用.query()方法:
df = (pd.read_csv(filename, header=None, names=cols)
.query('Name != "Name" and Sex != "Sex"'))
Run Code Online (Sandbox Code Playgroud)
我不确定这是最优雅的方式,但这也应该有效:
df = pd.read_csv(filename, header=None, names=cols)
if (df.iloc[0] == cols).all():
df = df[1:].reset_index(drop=True)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2227 次 |
| 最近记录: |