如果header = None

时间:2016-05-13 09:22:58

标签: python validation csv pandas dataframe

有点腌渍,会很感激帮助。 尝试验证具有不同标头结构的不同csv文件。例如,type1.csv具有以下

COL1|COL2|COL3|COL4
A1|A2|A3|A4
B1|B2|B3|B4
C1|C2|C3|C4
D1|D2|D3|D4

使用标头=无

df = pd.read_csv(type1.csv, sep='|', header=None)

呈现

#     0     1     2     3
0  COL1  COL2  COL3  COL4
1    A1    A2    A3    A4
2    B1    B2    B3    B4
3    C1    C2    C3    C4
4    D1    D2    D3    D4

这很好,因为我可以在列轴上为索引0(col1,col2等)发出替换

header = df.columns.values

但是,如果我有另一个具有以下结构的文件type2.csv

Datetime|timezone|source|unique identifier
Non Header Row Count = 4 |||
COL1|COL2|COL3|COL4
A1|A2|A3|A4
B1|B2|B3|B4
C1|C2|C3|C4
D1|D2|D3|D4

with headers = None给我数据框

#                          0         1       2                  3
0                   Datetime  timezone  source  unique identifier
1  Non Header Row Count = 4        NaN     NaN                NaN
2                       COL1      COL2    COL3               COL4
3                         A1        A2      A3                 A4
4                         B1        B2      B3                 B4
5                         C1        C2      C3                 C4
6                         D1        D2      D3                 D4

我想要实现的方法是读取标题设置为none的数据帧,然后遍历以查找具有任何值COL1,COL2,COL3等的行,并将数据帧拆分为高于该索引的值,也许使用head(n)其中n是包含COL1,COL2等的行,无论该行上方是什么(我打算将其拆分为新的数据帧以对内容进行一些分析)

示例拆分

#                          0         1       2                  3
0                   Datetime  timezone  source  unique identifier
1  Non Header Row Count = 4        NaN     NaN                NaN
#     0     1     2     3
0  COL1  COL2  COL3  COL4
1    A1    A2    A3    A4
2    B1    B2    B3    B4
3    C1    C2    C3    C4
4    D1    D2    D3    D4

使用isin()或isin()与正则表达式或查询()的组合是否可以实现?我已经搜索了类似的例子和问题,但无法弄清楚干净地工作(我仍然掌握着pandas文档)。

我想避免跳过,因为我希望将数据保持在COL1,COL2,COL3行之上以进行数据健全性检查,以便进行预验证步骤,读取文件并确定我的标题列位置然后读取它作为使用skiprows的数据框不是这里的最佳方法。

如果可以的话,任何帮助表示赞赏。如果问题不明确或者我做出愚蠢的假设/采取不好的方法,请道歉。任何批评,反馈或建议欢迎(建设性或其他方式:))

1 个答案:

答案 0 :(得分:0)

您可以使用:

    <script src="http://malsup.github.com/jquery.form.js"></script>

编辑:

然后您可以在contains boolean indexing的第一列中找到 $("#formid").ajaxForm() 的索引:

import pandas as pd
import io

temp=u"""Datetime|timezone|source|unique identifier
Non Header Row Count = 4 |||
COL1|COL2|COL3|COL4
A1|A2|A3|A4
B1|B2|B3|B4
C1|C2|C3|C4
D1|D2|D3|D4"""
#after testing replace io.StringIO(temp) to filename
df1 = pd.read_csv(io.StringIO(temp), sep="|")
print df1
                    Datetime timezone source unique identifier
0  Non Header Row Count = 4       NaN    NaN               NaN
1                       COL1     COL2   COL3              COL4
2                         A1       A2     A3                A4
3                         B1       B2     B3                B4
4                         C1       C2     C3                C4
5                         D1       D2     D3                D4

df2 = df1[2:]
df2.columns = df1.loc[1,:]
df2 = df2.reset_index(drop=True).rename_axis(None, axis=1)
print df2
  COL1 COL2 COL3 COL4
0   A1   A2   A3   A4
1   B1   B2   B3   B4
2   C1   C2   C3   C4
3   D1   D2   D3   D4

print df1[:1]
                    Datetime timezone source unique identifier
0  Non Header Row Count = 4       NaN    NaN               NaN