我有一个像这样的pandas数据框:
df = pandas.DataFrame({
'Grouping': ["A", "B", "C"],
'Elements': ['[\"A1\"]', '[\"B1\", \"B2\", \"B3\"]', '[\"C1\", \"C2\"]']
}).set_index('Grouping')
所以
Elements
Grouping
===============================
A ["A1"]
B ["B1", "B2", "B3"]
C ["C1", "C2"]
即。一些列表被编码为字符串作为列表。什么是将其重塑为如此整齐的数据集的简洁方法:
Elements
Grouping
====================
A A1
B B1
B B2
B B3
C C1
C C2
没有求助于循环?我能想到的最好的是:
df1 = pandas.DataFrame()
for index, row in df.iterrows():
df_temp = pandas.DataFrame({'Elements': row['Elements'].replace("[\"", "").replace("\"]", "").split('\", \"')})
df_temp['Grouping'] = index
df1 = pandas.concat([df1, df_temp])
df1.set_index('Grouping', inplace=True)
但那很难看。
答案 0 :(得分:2)
您可以使用.str.extractall()
:
df.Elements.str.extractall(r'"(.+?)"').reset_index(level="match", drop=True).rename({0:"Elements"}, axis=1)
结果:
Elements
Grouping
A A1
B B1
B B2
B B3
C C1
C C2
答案 1 :(得分:1)
您可以将“列表”转换为list
,然后我们使用apply
和pd.Series
stack
import ast
df.Elements=df.Elements.apply(ast.literal_eval)
df.Elements.apply(pd.Series).stack().reset_index(level=1,drop=True).to_frame('Elements')
Elements
Grouping
A A1
B B1
B B2
B B3
C C1
C C2