如何在Pandas中阅读格式错误的宽csv?

时间:2018-04-11 13:00:04

标签: python pandas

我(非常令人惊讶地)在Pandas中使用以下格式阅读csv时遇到一些困难(这是真实的东西 - 相信我)

enter image description here

如您所见,真实数据是:

  • 广泛格式
  • 仅从第6行开始
  • B
  • 处有一个空列

我尝试过以下操作,但没有成功。

my_df = pd.read_csv('P://mypath/bogus_csv.csv', 
                     skiprows = [0,1,2,3,4],
                     usecols = ([0]+ range(2,5)))

但是返回ValueError: Passed header names mismatches usecols并且它根本不是最优的,因为我已经硬编码了usecol中的列数。

实际上,我可能事先并不知道我有多少列(日期)。

有什么想法吗? 谢谢!

编辑:这里是csv作为文字(在崇高文字中):

Title   "text"
Metric  Parallel
Date Range  10 Jan 2018 - 11 Apr 2018
Content Web, Online, Fax

Label       "10 Jan 2018"   "11 Jan 2018"   "12 Jan 2018"   
"myquery"       70  108 92  

以下是它在wordpad中的显示方式

enter image description here

1 个答案:

答案 0 :(得分:1)

使用正则表达式空白分隔符和发布的'csv',您可以尝试:

import pandas as pd

df = pd.read_csv('sample.csv', delimiter=r"\s+", skiprows=5, header=None)
df = df.set_index(0)
df = df.T
df = df.set_index('Label')

通过一些转置和重新索引,给了我:

0           myquery
Label              
10 Jan 2018      70
11 Jan 2018     108
12 Jan 2018      92

索引标签单元格中有一个恼人的0,但可能不会妨碍

另一个选择是使用一个简单的空白分隔符,它提供偏移的NaN,我们必须通过逐列分割来删除,然后连接。不太热衷于这个选项。

df = pd.read_csv('sample.csv', delimiter=" ", skiprows=5, header=None)
df = df.set_index(0)
df = df.T
dfs = []
for col in df.columns:
    df_col = df[col]
    df_col = df_col.dropna().reset_index(drop=True)
    dfs.append(df_col)
df = pd.concat(dfs, 1).sort_index(1).set_index('Label')