首页 > 解决方案 > 将嵌套列表转换为 pd Dataframe 的快速和 Pythonic 方法

问题描述

我有一个列表,其中每个元素都是一个包含书中字符串的列表

test_list = [['I love Stackoverflow', 'For ever', 'and always'], ['I dont like rain', 'it is wet']]
book_names = ['message to SO', 'confessions']

我想获得以下数据框


          book              sentence
0  message to SO  I love Stackoverflow
1  message to SO              For ever
2  message to SO            and always
3    confessions      I dont like rain
4    confessions             it is wet

现在,我设法用以下代码做到了这一点:

df = pd.DataFrame(test_list, index=book_names).stack().reset_index(level=0)
df.rename(columns={'level_0':'book',
                    0 : 'sentence'},
                    inplace = True)

导致 :

            book              sentence
0  message to SO  I love Stackoverflow
1  message to SO              For ever
2  message to SO            and always
0    confessions      I dont like rain
1    confessions             it is wet

现在我必须重新索引结果:

df.reset_index(drop=True)

我对这段代码不是特别满意,不得不重置索引和重命名列。有人有更好的解决方案吗?

实际上 test_list 相当大,所以速度也是一个重要的考虑因素

提前致谢

标签: pythonpandaslistnested

解决方案


我认为这里最好在列表理解中创建元组列表zip并传递给DataFrame构造函数:

df = pd.DataFrame([(b,s) for b, n in zip(book_names, test_list) for s in n], 
                   columns=['book','sentence'])
print (df)
            book              sentence
0  message to SO  I love Stackoverflow
1  message to SO              For ever
2  message to SO            and always
3    confessions      I dont like rain
4    confessions             it is wet

只有熊猫解决方案是DataFrame.explode

df = pd.DataFrame({'book':book_names ,
                   'sentence':test_list}).explode('sentence').reset_index(drop=True)
print (df)
            book              sentence
0  message to SO  I love Stackoverflow
1  message to SO              For ever
2  message to SO            and always
3    confessions      I dont like rain
4    confessions             it is wet

推荐阅读