2017-09-19 2 views
0

によって再構築:分割データフレームと私はこのようなシートごとに複数のテーブルを持つCSVシート持つヘッダ

Name  Header-1  Header-8  Header 3 
Random Note 
Jack  X       X 
Jane     X 
NAN  NAN   NAN   NAN 
Name  Header 3  Header 2  Header 7 
Random note 
Jeremy X   X 
Joey        X 

が、私はこのような結果、1つのデータフレームにそれらを再構築し、空行でテーブルを分割でした:

Name  Header-1  Header-2  Header-3  ..... 
Jack  X 
Jane     X 
Jeremy        X 
Joey   X   X   X 

ブランク行を新しいインデックスとして使用し、各テーブルを新しいdfとして読みたいと思います。各テーブルのヘッダーは同じですが、すべて正しい順序ではありません。最終的には、それらを一緒に戻して1つのきれいなDFにしたいと思います。

答えて

0

あなたは次のように設定されたCSVがあるとしましょう:

Name,Header-1,Header-2,Header-3 
Random,Note, , 
Jack,X,X, 
Jane,X, , 
,,, 
Name,Header-3,Header-2,Header-1 
Random,note, , 
Jeremy,X,X, 
Joey, , ,X 

あなたは自己explanotaryあるコードを以下に、このファイルで作業することができます

import pandas as pd 
# Read csv file 
df = pd.read_csv("D:/tmp/data.csv", sep=',') 

#Find columns which are null, create partitions and group by them 
isnull = (df["Name"].isnull()) 
partitions = (isnull != isnull.shift()).cumsum() 
gb = df[~isnull].groupby(partitions) 
keys = gb.groups.keys() 

# Extract all the dataframes 
dfs = [gb.get_group(g) for g in keys] 

datas = [] 
# Set the header as first row for all dataframes that are not the first one 
for i,data in enumerate(dfs): 
    if i!=0: # First dataframe has already set the correct header 
     data.columns = data.ix[data.index[0]] 
     data = data.drop(data.index[0]) 
    datas.append(data) 

# Concatenate the dataframes and reset the index 
df_concat = pd.concat(datas) 
df_out = df_concat.reset_index(drop=True) 

# Change the order of the columns to get "Name" as first column 
cols = df_out.columns.tolist() 
cols = cols[-1:] + cols[:-1] 
df_out = df_out[cols] 

だからあなたの入力は次のとおりです。

>>> df 
    Name Header-1 Header-2 Header-3 
0 Random  Note      
1 Jack   X   X   
2 Jane   X      
3  NaN  NaN  NaN  NaN 
4 Name Header-3 Header-2 Header-1 
5 Random  note      
6 Jeremy   X   X   
7 Joey        X 

この例のヘッダーは、抽出する2番目のデータフレームの順序が異なることに注意してください。

そして、あなたの出力は次のようになります。

>>> df_out 
    Name Header-1 Header-2 Header-3 
0 Random  Note     
1 Jack  X  X   
2 Jane  X     
3 Random      note 
4 Jeremy     X  X 
5 Joey  X     
+0

私は第六行「名前」でKeyError例外を取得しています - 私は別の列名を入れ替え... – Che

+0

あなたは私が示した例としてみてくださいましたか?質問をエラーが発生している例で更新してください。 –

関連する問題