2016-05-13 66 views
1

位咸菜,将不胜感激的帮助。 尝试验证具有不同标题结构的不同csv文件。例如type1.csv具有以下使用熊猫在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 

但是,如果我有一个具有以下结构

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 

页眉=无给我的数据框

#       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 

我想实现是该方法的另一个文件type2.csv读取一个头部设置为none的数据框,然后迭代查找具有任何值COL1,COL2,COL3等的行,并将数据帧拆分为该索引上方的值,可能使用head(n),其中n是包含COL1的行, COL2等,不管什么是abov Ë该行(我打算这个分割到一个新的数据框上的内容运行一些分析)

例如分裂

#       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()与正则表达式或查询()的组合?我已经搜索了类似的例子和问题,但无法弄清楚它的工作原理(我还在掌握熊猫文档)。

我想避免skiprows,因为我想保留数据上面的COL1,COL2,COL3行数据健全性检查,所以做一个预先验证步骤读取文件和确定我的标题列位置然后阅读它作为一个数据框使用skiprows不会是最佳的方法在这里。

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

回答

0

您可以使用:

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 

编辑:

然后你就可以找到索引其中第一列是由COL1containsboolean indexing

col = df1[df1.iloc[:,0].str.contains('COL1')].index.tolist()[0] 
print col 
1 

df2 = df1[col+1:] 
df2.columns = df1.loc[col,:] 
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[:col] 
        Datetime timezone source unique identifier 
0 Non Header Row Count = 4  NaN NaN    NaN 
+0

这工作得很好。我没有想到像那样接近它。感谢您的反馈和建议。我会尽力在此扩展并提供额外的反馈:) –