将嵌套列表转换为pd数据帧的快速Python方法
我有一个列表,其中每个元素都是一个列表,带有一本书中的字符串将嵌套列表转换为pd数据帧的快速Python方法,python,pandas,list,nested,Python,Pandas,List,Nested,我有一个列表,其中每个元素都是一个列表,带有一本书中的字符串 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
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)
我对这段代码不是特别满意,因为必须重置索引和重命名列。谁有更好的解决方案
实际上,测试列表相当大,因此速度也是一个重要的考虑因素
提前感谢我认为下面是使用
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
唯一的解决方案是:
非常感谢,令人惊讶的答案!还有一个问题,为什么您更喜欢元组/列表理解方法而不是熊猫解决方案编辑:nm,我也喜欢它,更干净。Thanks@Rens-嗯,我认为这取决于数据,但我认为
列表理解
应该更快。真实数据中的最佳测试性能
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