我有一个数据集,其中一个列的每个元素都是一个列表。我想将其展开,使得每个列表元素都有自己的一行。
我已经使用iterrows,dict和append解决了这个问题(见下文),但是在我的真实DF中速度太慢了。是否有一种方法可以加快速度?
如果有必要的话,我可以考虑用另一种格式(也许是分层的df?)替换每个元素的列表列。
编辑: 我有很多列,有些可能会在未来改变。我唯一确定的是我有fields列。这就是为什么我在我的解决方案中使用了dict。
为了玩耍而创建一个df的最小示例:
我已经使用iterrows,dict和append解决了这个问题(见下文),但是在我的真实DF中速度太慢了。是否有一种方法可以加快速度?
如果有必要的话,我可以考虑用另一种格式(也许是分层的df?)替换每个元素的列表列。
编辑: 我有很多列,有些可能会在未来改变。我唯一确定的是我有fields列。这就是为什么我在我的解决方案中使用了dict。
为了玩耍而创建一个df的最小示例:
import StringIO
df = pd.read_csv(StringIO.StringIO("""
id|name|fields
1|abc|[qq,ww,rr]
2|efg|[zz,xx,rr]
"""), sep='|')
df.fields = df.fields.apply(lambda s: s[1:-1].split(','))
print df
生成的数据框:
id name fields
0 1 abc [qq, ww, rr]
1 2 efg [zz, xx, rr]
我的(较慢)解决方案:
new_df = pd.DataFrame(index=[], columns=df.columns)
for _, i in df.iterrows():
flattened_d = [dict(i.to_dict(), fields=c) for c in i.fields]
new_df = new_df.append(flattened_d )
结果为
id name fields
0 1.0 abc qq
1 1.0 abc ww
2 1.0 abc rr
0 2.0 efg zz
1 2.0 efg xx
2 2.0 efg rr