2016-05-13 52 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

這工作得很好。我沒有想到像那樣接近它。感謝您的反饋和建議。我會盡力在此擴展並提供額外的反饋:) –