python - 将嵌套列表转换为 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 相当大,所以速度也是一个重要的考虑因素
提前致谢
解决方案
我认为这里最好在列表理解中创建元组列表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
推荐阅读
- python - ORA-01008: 在 Python 中执行合并语句时,并非所有变量都绑定
- phyloseq - qiime2R - qiime 到 phyloseq
- c++ - OPC DA 客户端 ItemMgt 不正确的功能错误
- mongodb - 从 mongoDb 中的数组中删除对象
- javascript - MongoDB,在特定条件下更改信息
- python - 无法在 Anaconda 上安装 Opencv(Windows)
- javascript - Chrome 扩展程序中未显示另存为对话框
- mongodb - $lookup 阶段子管道 MongoDB 中具有不同运算符的多个 JOIN 条件
- python - Python中传感器实时信号的FFT计算
- javascript - 为什么布尔值不改变?