pandas Dataframe 格式更改,我想从左 Dataframe 转换到右 Dataframe

dl5txlt9  于 2023-01-24  发布在  其他
关注(0)|答案(2)|浏览(120)

我试过融化,解栈和堆叠Pandas函数,但不明白如何实现它们。
Dataframe 转换和重组:

von4xj4u

von4xj4u1#

我认为所需的转换不能直接使用Pandas函数来完成,因为源数据结构不适合Pandas DataFrame的概念,除此之外,它也不包含目标DataFrame预期具有的所需列名和列的信息沿着必要的重复行数。
请参见Python代码,它通过为数据表提供字典来说明这个问题:

import pandas as pd
pd_json_dict_src = {
    'Date':'2023-01-01',
    'Time':'14:00',
    'A':{
        'Intro':[
            {'FIB':'1.00'},
            {'DIB':'2.00'} ] },
    'B':{
        'Intro':[
            {'FIB':'3.00'},
            {'DIB':'4.00'} ] }
}
df_src = pd.DataFrame.from_dict(pd_json_dict_src)
print(df_src)
# -----------------------------------------------
pd_json_dict_tgt = {
    'Date':['2023-01-01','2023-01-01'],
    'Time':['14:00','14:00'],
    'Area':['A','B'],
    'Tech':['Intro','Intro'],
    'FIB' :['1.00','3.00'],
    'DIB' :['2.00','4.00']
}
df_tgt = pd.DataFrame.from_dict(pd_json_dict_tgt)
print(df_tgt)

印刷品

Date  ...                                   B
Intro  2023-01-01  ...  [{'FIB': '3.00'}, {'DIB': '4.00'}]

[1 rows x 4 columns]
         Date   Time Area   Tech   FIB   DIB
0  2023-01-01  14:00    A  Intro  1.00  2.00
1  2023-01-01  14:00    B  Intro  3.00  4.00

我也没有看到任何易于编码的自动化方法能够将由字典定义的源数据结构转换为目标字典的数据结构。
换句话说,似乎没有一种简单明了的通用方法来扁平化列式深度嵌套数据结构,尤其是在选择Python Pandas作为扁平化工具时,至少在这里没有其他答案证明我和这个陈述是错误的情况下。

omqzjyyz

omqzjyyz2#

创建 Dataframe :

df = pd.DataFrame(data=[["2023-01-01","14:00",1.0,2.0,3.0,4.0]])

            0      1     2    3    4    5
0  2023-01-01  14:00  1.00 2.00 3.00 4.00

设置索引列:

df = df.set_index([0,1]).rename_axis(["Date", "Time"])

                     2    3    4    5
Date       Time                     
2023-01-01 14:00  1.00 2.00 3.00 4.00

创建多级列:

df.columns = pd.MultiIndex.from_tuples([("A", "Intro", "FIB"), ("A", "Intro", "DIB"), ("B", "Intro", "FIB"), ("B", "Intro", "DIB")], names=["Area", "Tech", ""])

Area                  A           B     
Tech              Intro       Intro     
                    FIB  DIB    FIB  DIB
Date       Time                       
2023-01-01 14:00   1.00 2.00   3.00 4.00

在“区域”和“技术”级别上使用stack()

df = df.stack(["Area","Tech"])

                             DIB  FIB
Date       Time  Area Tech           
2023-01-01 14:00 A    Intro 2.00 1.00
                 B    Intro 4.00 3.00

重置索引以创建列“日期”和“时间”并重复其值:

df = df.reset_index()

         Date   Time Area   Tech  DIB  FIB
0  2023-01-01  14:00    A  Intro 2.00 1.00
1  2023-01-01  14:00    B  Intro 4.00 3.00

相关问题