我有一个列表,其中每个元素都是一个包含书中字符串的列表
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 相当大,因此速度也是一个重要的考虑因素
提前致谢
最佳答案
我认为这里最好使用 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
唯一的 pandas 解决方案是 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
关于python - 将嵌套列表转换为 pd Dataframe 的快速且 Pythonic 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66687992/