我有一个列表列表,如下所示:
[['A'],
['America'],
['2017-39', '2017-40', '2017-41', '2017-42', '2017-43'],
[10.0, 6.0, 6.0, 6.0, 1.0],
[5.0,7.0,8.0,9.0,1.0],
,
['B'],
['Britan'],
['2017-38', '2017-39', '2017-40', '2017-41', '2017-42', '2017-43', '2017-44'],
[41.0, 27.0, 38.0, 36.0, 33.0, 41.0, 8.0],
[40.0, 38.0, 28.0, 27.0, 23.0, 65.0, 4.0]]
我想把它转换成一个应该看起来像的数据框
A America 2017-39 10.0 5.0
na na 2017-40 6.0 7.0
na na 2017-41 6.0 8.0
na na 2017-42 6.0 9.0
na na 2017-43 1.0 10.0
B Britan 2017-38 41.0 40.0
na na 2017-39 27.0 38.0
na na 2017-40 38.0 28.0
na na 2017-41 36.0 27.0
na na 2017-42 33.0 23.0
na na 2017-43 41.0 65.0
na na 2017-44 8.0 4.0
我如何编写代码才能实现它,因为我是 python 的新手,所以我很难过。
非常感谢您在这方面花时间和精力帮助我
最佳答案
import pandas as pd
data = [['A'],
['America'],
['2017-39', '2017-40', '2017-41', '2017-42', '2017-43'],
[10.0, 6.0, 6.0, 6.0, 1.0],
[5.0,7.0,8.0,9.0,1.0],
['B'],
['Britan'],
['2017-38', '2017-39', '2017-40', '2017-41', '2017-42', '2017-43', '2017-44'],
[41.0, 27.0, 38.0, 36.0, 33.0, 41.0, 8.0],
[40.0, 38.0, 28.0, 27.0, 23.0, 65.0, 4.0]]
result = {}
for letters, countries, dates, val1, val2 in zip(*[iter(data)]*5):
result[tuple(letters+countries)] = pd.DataFrame({'date':dates, 'val1':val1, 'val2':val2})
result = pd.concat(result)
print(result)
产量
date val1 val2
A America 0 2017-39 10.0 5.0
1 2017-40 6.0 7.0
2 2017-41 6.0 8.0
3 2017-42 6.0 9.0
4 2017-43 1.0 1.0
B Britan 0 2017-38 41.0 40.0
1 2017-39 27.0 38.0
2 2017-40 38.0 28.0
3 2017-41 36.0 27.0
4 2017-42 33.0 23.0
5 2017-43 41.0 65.0
6 2017-44 8.0 4.0
上面的主要思想是使用"grouper idiom" zip(*[iter(data)]*5)
将 data
中的项目以 5 个为一组进行分组。这样,您可以使用
for letters, countries, dates, val1, val2 in zip(*[iter(data)]*5):
一次循环遍历 5 项数据
。
pd.concat
可以接受 DataFrames 的 dict
作为输入,并将它们连接到一个 DataFrame 中,MultiIndex 由 dict
的键组成。
所以for-loop
被用来组成DataFrames的dict
,
for letters, countries, dates, val1, val2 in zip(*[iter(data)]*5):
result[tuple(letters+countries)] = pd.DataFrame({'date':dates, 'val1':val1, 'val2':val2})
然后
result = pd.concat(result)
生成所需的 DataFrame。
并不是说您可以删除 MultiIndex 的最后一层:
In [91]: result.index = result.index.droplevel(level=-1)
In [92]: result
Out[92]:
date val1 val2
A America 2017-39 10.0 5.0
America 2017-40 6.0 7.0
America 2017-41 6.0 8.0
America 2017-42 6.0 9.0
America 2017-43 1.0 1.0
B Britan 2017-38 41.0 40.0
Britan 2017-39 27.0 38.0
Britan 2017-40 38.0 28.0
Britan 2017-41 36.0 27.0
Britan 2017-42 33.0 23.0
Britan 2017-43 41.0 65.0
Britan 2017-44 8.0 4.0
但我不推荐这样做,因为它会使索引变得不唯一:
In [96]: result.index.is_unique
Out[96]: False
这可能会导致 future 的困难,因为一些 Pandas 操作仅适用于具有唯一索引的 DataFrame。
关于python - 如何在python中将列表列表转换为数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50437159/