【问题标题】:How can I convert tuple of dictionaries into an organized dataframe?如何将字典元组转换为有组织的数据框?
【发布时间】:2020-04-14 09:16:37
【问题描述】:

我正在提取一个以以下格式检索数据的 API。

     data = ({'2019-12-20': {'SMA': '216.0037'},
              '2019-12-19': {'SMA': '215.4711'},
              '2019-12-18': {'SMA': '214.9335'},
              '2019-12-17': {'SMA': '214.4074'}})

目前,当我尝试运行“data = pd.DataFrame(data)”时,它会返回一个包含 2 行的数据框,该数据框将每个日期用作单独的列,并为每一行提供一个字典作为值(下面的示例)。

           2019-12-20       |       2019-12-19     |      2019-12-18
 0  "{ 'SMA' : '216.0037' } |  {'SMA': '215.4710"} | {'SMA': '214.9335'}
 1            NaN           |         NaN          |        NaN

我想弄清楚如何将这些数据转换为以下格式的数据框。

        date     |   SMA
 ----------------------------
 0  '2019-12-20' | '216.0036'
 1  '2019-12-19' | '215.4711'
 2  '2019-12-18' | '214.9335'
 3  '2019-12-17' | '214.4047'

任何帮助将不胜感激!

【问题讨论】:

    标签: python pandas dataframe dictionary tuples


    【解决方案1】:

    IIUC

    pd.DataFrame(data).T.reset_index().rename(columns={'index':'date'})
             date       SMA
    0  2019-12-20  216.0037
    1  2019-12-19  215.4711
    2  2019-12-18  214.9335
    3  2019-12-17  214.4074
    

    from_dict

    pd.DataFrame.from_dict(data,'index').reset_index().rename(columns={'index':'date'})
                     SMA
    2019-12-17  214.4074
    2019-12-18  214.9335
    2019-12-19  215.4711
    2019-12-20  216.0037
    

    【讨论】:

      【解决方案2】:

      从您的代码看来,数据是一个字典(外括号被忽略)。

      data = ({
          '2019-12-20': {'SMA': '216.0037'},
          '2019-12-19': {'SMA': '215.4711'},
          '2019-12-18': {'SMA': '214.9335'},
          '2019-12-17': {'SMA': '214.4074'}
      })
      assert isinstance(data, dict)
      

      如果是这样,那么您想要的数据框可以按如下方式生成。

      pd.DataFrame(
          [(k, v['SMA']) for k, v in data.items()],
          columns=['date', 'SMA']
      )
      

      输出:

               date       SMA
      0  2019-12-20  216.0037
      1  2019-12-19  215.4711
      2  2019-12-18  214.9335
      3  2019-12-17  214.4074
      

      【讨论】:

        【解决方案3】:

        您可以使用 pandas.DataFrame.T 实现此目的

        通过将行写入列来反映 DataFrame 在其主对角线上,反之亦然。属性 T 是方法的访问器。

        df = pd.DataFrame(data).T.reset_index().rename(columns={'index':'date'}) 将返回:

                 date       SMA
        0  2019-12-20  216.0037
        1  2019-12-19  215.4711
        2  2019-12-18  214.9335
        3  2019-12-17  214.4074
        

        【讨论】:

          猜你喜欢
          • 2020-02-05
          • 2018-02-03
          • 2016-03-11
          • 2018-02-05
          • 2017-10-10
          • 1970-01-01
          • 2018-12-21
          • 2017-11-22
          相关资源
          最近更新 更多