2016-09-19 3 views
1

複雑なjsonを読み込んだ結果からのデータフレームの出力は以下のようになります。リストを行として持つ通常のデータフレームに変換します。行を列に分割する

個々の行は、単一の列内のリストです。

以下は、私がパンダを使用して、個々の列に分割しようとしたサンプルのデータフレーム(df

col 
[A,1,3,4,Null] 
[B,4,5,6,Null] 
[C,7,8,9,Null] 

であるが、それは、個々の行として作業自体がリストであるがdidntの。 データフレームを以下のようにします。

colA,colB,colC,colD,colE 
A 1 3  4 Null 
B 4 5  6 Null 
C 7 8  9 Null 

手動で指定する列名を自動生成する必要はありません。

答えて

1

あなたはDataFrame.from_recordsを使用していますが、最初の列colの値から、ネストされたlistを作成する必要がありますすることができます

df1 = pd.DataFrame.from_records(df.col.values.tolist()) 
print(df1) 
    0 1 2 3  4 
0 A 1 3 4 Null 
1 B 4 5 6 Null 
2 C 7 8 9 Null 

タイミング

いけないカラム名を指定する必要が場合

df = pd.DataFrame({'col':[['A',1,3,4,'Null'],['B',4,5,6,'Null'],['C',7,8,9,'Null']]}) 
print (df) 
        col 
0 [A, 1, 3, 4, Null] 
1 [B, 4, 5, 6, Null] 
2 [C, 7, 8, 9, Null] 

print (df.col.values.tolist()) 
[['A', 1, 3, 4, 'Null'], ['B', 4, 5, 6, 'Null'], ['C', 7, 8, 9, 'Null']] 

df1 = pd.DataFrame.from_records(df.col.values.tolist(), 
           columns=['colA','colB','colC','colD','colE']) 

print(df1) 
    colA colB colC colD colE 
0 A  1  3  4 Null 
1 B  4  5  6 Null 
2 C  7  8  9 Null 

#len(df) = 4k 
df = pd.concat([df]*1000).reset_index(drop=True) 

In [80]: %timeit pd.DataFrame(df['col'].apply(pd.Series).values, columns=['colA','colB','colC','colD','colE']) 
1 loop, best of 3: 753 ms per loop 

In [81]: %timeit pd.DataFrame.from_records(df.col.values.tolist(), columns=['colA','colB','colC','colD','colE']) 
100 loops, best of 3: 3.73 ms per loop 
0

あなたは各行のapplypd.Series CTORを使用した結果からDFを構築することができる:

In [99]: 
pd.DataFrame(df['col'].apply(pd.Series).values, columns=['colA','colB','colC','colD','colE']) 

Out[99]: 
    colA colB colC colD colE 
0 A 1 3 4 Null 
1 B 4 5 6 Null 
2 C 7 8 9 Null 
関連する問題