转换为以行为列表的普通数据框。将行拆分为列
Transform to normal Data Frame which has row as list. Split rows to column
我的数据框从读取复杂的 json 输出如下所示。
其中单行是单列中的列表。
下面是示例数据框(df
)
col
[A,1,3,4,Null]
[B,4,5,6,Null]
[C,7,8,9,Null]
我尝试使用 pandas 拆分为单独的列,但它不起作用,因为单独的行本身就是一个列表。
我希望数据框如下所示。
colA,colB,colC,colD,colE
A 1 3 4 Null
B 4 5 6 Null
C 7 8 9 Null
我不需要手动指定列名,它可以自动生成。
您可以使用 DataFrame.from_records
,但首先需要根据列 col
:
的值创建嵌套 list
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
如果不需要指定列名:
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
时间:
#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
您可以根据在每一行上使用 apply
和 pd.Series
构造函数的结果构造一个 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
我的数据框从读取复杂的 json 输出如下所示。
其中单行是单列中的列表。
下面是示例数据框(df
)
col
[A,1,3,4,Null]
[B,4,5,6,Null]
[C,7,8,9,Null]
我尝试使用 pandas 拆分为单独的列,但它不起作用,因为单独的行本身就是一个列表。 我希望数据框如下所示。
colA,colB,colC,colD,colE
A 1 3 4 Null
B 4 5 6 Null
C 7 8 9 Null
我不需要手动指定列名,它可以自动生成。
您可以使用 DataFrame.from_records
,但首先需要根据列 col
:
list
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
如果不需要指定列名:
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
时间:
#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
您可以根据在每一行上使用 apply
和 pd.Series
构造函数的结果构造一个 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