【问题标题】:Convert a dictionary including many dataframes into a dataframe将包含许多数据帧的字典转换为数据帧
【发布时间】:2018-01-26 12:56:04
【问题描述】:

我有一本来自 influxdb 时间序列数据库的字典。该字典包含许多键,例如 KEY1,KEY2... 所有键对应一个表格数据集。举个例子:

dict = { KEY1:     MAX      MIN  
         Date1     max1     min1
         Date2     max2     min2,

         KEY2:     MAX      MIN  
         Date1     max3     min3
         Date2     max4     min4}

我想要的是一个像这样的数据框:

KEYS     DATES      MAX         MIN
KEY1     Date1      max1        min1
KEY1     Date2      max2        min2
KEY2     Date1      max3        min3
KEY2     Date2      max4        min4

我希望它足够清楚。

【问题讨论】:

    标签: python pandas dictionary dataframe time-series


    【解决方案1】:

    只需为每个数据框和concat添加一个key属性,如下所示:

    import pandas as pd
    
    d = {'k1': pd.DataFrame({'max': [1, 2, 3], 'min': [1, 2, 3]}, index=[0, 1, 2]),
         'k2': pd.DataFrame({'max': [4, 5, 6], 'min': [4, 5, 6]}, index=[3, 4, 5])}
    
    for k in d:
        d[k].insert(0, 'key', [k]*len(d[k]))
    
    res = pd.concat(d.values())
    print(res)
    

    打印出来

      key  max  min
    0  k1    1    1
    1  k1    2    2
    2  k1    3    3
    3  k2    4    4
    4  k2    5    5
    5  k2    6    6
    

    n.b.如果索引在数据帧中重复,这也有效:

      key  max  min
    0  k1    1    1
    1  k1    2    2
    2  k1    3    3
    0  k2    4    4
    1  k2    5    5
    2  k2    6    6
    

    【讨论】:

      【解决方案2】:

      您可以使用 functools 包中的 reduce 函数。 functools 包通常带有 Python 的标准安装。所以,你可以这样写:

      from functools import reduce
      
      for key in dict.keys():
          dict[key]["KEYS"] = key
      
      combined = reduce(lambda x,y: x.append(y), dict.values())
      

      首先,您浏览每个数据框,并创建“KEYS”列。然后, reduce 函数将遍历字典中的数据帧,一次将两个组合成一个数据帧,然后将该结果与下一个数据帧组合,依此类推,直到遍历字典中的所有数据帧。

      这被存储在结果变量中,组合在一起。

      看起来 DATES 是字典中每个数据帧的索引,所以如果是这种情况,您可以添加:

      combined["DATES"] = combined.index.tolist()
      

      您也可以根据需要重新排列列:

      combined = combined[["KEYS", "DATES", "MAX", "MIN"]]
      

      如果这对你有用,请告诉我。

      【讨论】:

      • 嘿,它给出了一个 ValueError:值的长度与索引的长度不匹配。
      猜你喜欢
      • 2020-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多