【问题标题】:Python dict with values as tuples to pandas DataFramePython dict 将值作为 pandas DataFrame 的元组
【发布时间】:2018-02-15 02:39:41
【问题描述】:

我有以下字典:

td = {'q1':(111,222), 'q2':(333,444)}

我想将其转换为如下所示的数据框:

Query    Value1     Value2
q1       111       222
q2       333       444

我尝试了以下方法:

df = pd.DataFrame(td.items())

结果如下:

    0         1
0   q1  (111,222)
1   q2  (333,444) 

如果不是很明显,我是 python 和 pandas 的新手。如何获取具有元组值的字典以在数据框中充当单独的列?

我的最终目标是显示 value1 和 value2 之间的百分比差异。

【问题讨论】:

    标签: python pandas dictionary tuples


    【解决方案1】:

    设置

    td = {'q1':(111,222), 'q2':(333,444)}
    

    选项 1

    pd.DataFrame(td).T.rename_axis('Query').add_prefix('Value').reset_index()
    
      Query  Value0  Value1
    0    q1     111     222
    1    q2     333     444
    

    选项 2

    from cytoolz.dicttoolz import merge
    
    pd.DataFrame(
        [merge(
            {'Query': k},
            {'Value{}'.format(i): x for i, x in enumerate(v, 1)}
         ) for k, v in td.items()]
    )
    
      Query  Value1  Value2
    0    q1     111     222
    1    q2     333     444
    

    对评论的回应

    df = pd.DataFrame(td).T.rename_axis('Query').add_prefix('Value')
    df.assign(PctChg=df.pct_change(axis=1).iloc[:, -1]).reset_index()
    
      Query  Value0  Value1    PctChg
    0    q1     111     222  1.000000
    1    q2     333     444  0.333333
    

    或者

    df = pd.DataFrame(td).T.rename_axis('Query').add_prefix('Value')
    df.eval('PctChg = Value1 / Value0 - 1', inplace=False).reset_index()
    
      Query  Value0  Value1    PctChg
    0    q1     111     222  1.000000
    1    q2     333     444  0.333333
    

    【讨论】:

    • 我喜欢你的第一个选项 ;)
    • 我尝试了选项 1。我收到错误“行继续符后出现意外字符”。
    • 我将字典替换为您提供的名称td,因此您不应再有续行了。
    • 谢谢!请稍等一下,我会弄清楚如何将您的回复标记为答案...
    • 我的最后一步是添加第四列,即 Value1 和 Value2 之间的百分比变化。有没有办法轻松做到这一点?
    【解决方案2】:

    您可以使用字典迭代器定义dataindex

    import pandas as pd
    td = {'q1':(111,222), 'q2':(333,444)}
    pd.DataFrame(data=list(td.values()), index=list(td.keys()))
    

    应该产生一个DataFrame:

            0       1
        q1  111     222
        q2  333     444
    

    【讨论】:

      【解决方案3】:

      使用from_dict

      pd.DataFrame.from_dict({'q1':(111,222), 'q2':(333,444)}, orient='index')
      

      返回:

            0    1
      q1  111  222
      q2  333  444
      

      输入一些格式:

      df.columns = 'Value' + df.columns.to_series().add(1).astype(str)
      df.index.name = 'Query'
      

      你得到:

             Value1  Value2
      Query                
      q1        111     222
      q2        333     444
      

      【讨论】:

        【解决方案4】:

        试试这个?

        td = {'q1':(111,222), 'q2':(333,444)}
        df = pd.DataFrame(td).T
        df
        Out[25]: 
              0    1
        q1  111  222
        q2  333  444
        

        【讨论】:

        • pd.DataFrame(td).T.rename(columns=lambda x: x + 1).add_prefix('Value')
        猜你喜欢
        • 2016-11-03
        • 2021-11-06
        • 1970-01-01
        • 1970-01-01
        • 2017-01-28
        • 2021-07-16
        • 2020-12-31
        • 2013-12-28
        相关资源
        最近更新 更多