【问题标题】:Make dictionary keys into rows and dict values as columns with one value as column name and one as column value将字典键设为行,将字典值设为列,一个值作为列名,一个作为列值
【发布时间】:2021-10-07 21:02:45
【问题描述】:

我有以下数据:

print(tables['T10101'].keys())

dict_keys(['Y033RL', 'A007RL', 'A253RL', 'A646RL', 'A829RL', 'A008RL', 'A191RP', 'DGDSRL', 'A822RL', 'A824RL', 'A006RL', 'A825RL', 'A656RL', 'A823RL', 'Y001RL', 'DNDGRL', 'DDURRL', 'A021RL', 'A009RL', 'A020RL', 'DSERRL', 'A011RL', 'DPCERL', 'A255RL', 'A191RL'])

每个键都有以下值,一个元组列表: 日期相同,但值发生变化。

[('-20.7', '1930'), ('-33.3', '1931'), ('-41.4', '1932'), ('2.5', '1933'), ('38.3', '1934'), ('36.3', '1935'), ('37.2', '1936'), ('16.2', '1937'), ('-30.4', '1938'), ('15.4', '1939'), ('29.6', '1940'), ('17.2', '1941'), ('-42.6', '1942'), ('-10.2', '1943'), ('33.7', '1944'), ('43.2', '1945'), ('24.7', '1946'), ('36.0', '1947'), ('-8.3', '1947Q2'), 

我想创建以下数据框:

       1930 | 1931 | 1932 | 1933 | 1934 |
Y033RL|-20.7| -33.3| -41.4| 2.5  | 38.3 |
A007RL| data| data | data | data | data |

最好的方法是什么?我想出了这种加入创建数据框的迂回方式,但由于我有很多数据,它的效率非常低。我想先将所有内容都放在字典中,然后将其转换为一个数据框。

def dframeCreator(dataname):
    dframeList = list(tables[dataname].keys())
    df = tables[dataname][dframeList[0]]
    for x in range(len(dframeList[1:])):
        df = df.join(tables[dataname][dframeList[x+1]])
    return df

【问题讨论】:

    标签: python pandas dictionary merge


    【解决方案1】:

    如果tables 是你的字典,你可以这样做:

    df = pd.DataFrame(
        [{"idx": k, **dict([(b, a) for a, b in v])} for k, v in tables.items()],
    ).set_index("idx")
    df.index.name = None
    print(df)
    

    打印:

             1930   1931   1932 1933  1934  1935  1936  1937   1938  1939  1940  1941   1942   1943  1944  1945  1946  1947 1947Q2
    T10101  -20.7  -33.3  -41.4  2.5  38.3  36.3  37.2  16.2  -30.4  15.4  29.6  17.2  -42.6  -10.2  33.7  43.2  24.7  36.0   -8.3
    A007RL    xxx    xxx    xxx  xxx   xxx   xxx   xxx   xxx    xxx   xxx   xxx   xxx    xxx    xxx   xxx   xxx   xxx   xxx    xxx
    

    【讨论】:

    • 这几乎就是我要找的东西,但不完全是,其他用户找到了它。但感谢您抽出宝贵时间回复。
    【解决方案2】:

    我们可以使用dict 理解以适合创建数据框的标准格式对给定字典进行规范化

    d  = tables['T10101']
    df = pd.DataFrame({k: dict(map(reversed, v)) for k, v in d.items()}).T
    

    print(df)
    
             1930   1931   1932 1933 ... 1945  1946  1947 1947Q2
    Y033RL  -20.7  -33.3  -41.4  2.5 ... 43.2  24.7  36.0   -8.3
    

    【讨论】:

    • 感谢 Shubham 及时、简单且准确的回复 - 我将您标记为已回答,但我意识到我遗漏了代码中相当有问题的部分 - 我的字典嵌套如下:tables['T10101'] = {'Y033RL' , {'info': 'extra info on data here'}, {'data' : [('-20.7', '1930'), etc.]}} 。所以我很难改变理解以适应这种特殊性。
    • 你能提供一个与键T10101对应的精确字典输出吗?
    • ` {'Y033RL': {'info': {'Description': 'Equipment', 'METRIC_NAME': 'Fisher Quantity Index', 'UNIT_MULT': '0', 'CL UNIT' : '百分比变化,年率'}, '数据': [('-20.7', '1930'), ('-33.3', '1931'), ('-41.4', '1932') ] }, 'A007RL': {'info': {'Description': 'Fixed Investment', 'METRIC_NAME': 'Fisher Quantity Index', 'UNIT_MULT': '0', 'CL UNIT': '百分比变化,年利率'} , '数据': [('-22.3', '1930'), ('-28.9', '1931'), ('-38.4', '1932'), ('-9.7', '1933'), ('26.5', '1934')]} `
    • @Bigboss01 你可以使用df = pd.DataFrame({k: dict(map(reversed, v['data'])) for k, v in d.items()}).T
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-18
    • 1970-01-01
    • 2021-08-24
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多