python - 如何在python中将列表列表转换为数据框

标签 python list pandas dataframe

我有一个列表列表,如下所示:

[['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/

相关文章:

Python/Numpy 内存错误

R语言: Unexpected behaviour with function arguments in lapply

python-3.x - python 'concatenate' 需要额外的括号

list - 逐渐增长的单元阵列类

python - 如何加速简单的 Pandas for/if 循环?

python - tf.data.Dataset + tf.lookup.index_table_from_file 导致 "Table not initialized"错误

python - 如何在for循环中获取下一个元素

python - 反转 DataFrame 列,但保持索引

python - 如何在python中连接两个数据框

python - 如何在类中导入 Turtle 模块?