从 pyupset 的 csv 文件构建嵌套数据框或字典

Building nested dataframe or dictionary from csv file for pyupset

我有一个 csv 文件,格式如下,

Type_A, Type_B, Type_C
x1,x2,x3
y1,y2,y3

我需要按照以下格式构建嵌套字典或数据框

Type_A
    ID  Value
    1   x1
    2   y1
Type_B
    ID  Value
    1   x2
    2   y2
Type_C
    ID  Value
    1   x3
    2   y3

在我的第一次尝试中,我就是这样做的

import pandas as pd
df=pd.read_csv(csv_file)
df
Output:

     Type_A Type_B Type_C
0      x1      x2      x3
1      y1      y2      y3

虽然我需要做的就是读取列表中的每一列,然后添加索引,然后再将其组合到字典或嵌套数据框中

这就是我将它们存储在列表中的方法。

import pandas as pd
df=pd.read_csv(csv_file)
d1=df.Type_A.tolist()
d2=df.Type_B.tolist()
d3=df.Type_C.tolist()

然后添加索引使用 enumerate()

d1_df=list(enumerate(d1, 1))
d2_df=list(enumerate(d2, 1))
d3_df=list(enumerate(d3, 1))

d1_df  # this gives me [(1, 'x1'), (2, 'y1')]

接下来我将标签 ID 和值添加到数据框

labels = ['Id','Value']
d1_df = pd.DataFrame.from_records(d1_df, columns=labels)
d2_df = pd.DataFrame.from_records(d2_df, columns=labels)
d3_df = pd.DataFrame.from_records(d3_df, columns=labels)


d1_df  # this gives me Id Value
       #            0   1    x1
       #            1   2    y1

现在我需要以某种方式将它们嵌套在字典中

首先,而不是你的

d1_dict=list(enumerate(d1, 1))
d2_dict=list(enumerate(d2, 1))
d3_dict=list(enumerate(d3, 1))

使用

lst    = 3 * [None]            # Creating a list with 3 temporary items
lst[0] = list(enumerate(d1, 1))
lst[1] = list(enumerate(d2, 1))
lst[2] = list(enumerate(d3, 1))

(即列表的 list;我选择了更合适的名称 lst 而不是您的 dx_dict)。

然后创建嵌套字典:

result = {}
for col, id, lt in zip(df.columns, range(0, 3), lst):
    result[col] = {'ID': id}  # Creating column_name key and assigning inner dict to it
    result[col].update(lt)    # Adding key:value pairs from the list of pairs to inner dict

result 的值将是

{'Type_A': {'ID': 0, 1: 'x1', 2: 'y1'},
'Type_B': {'ID': 1, 1: ' x2', 2: ' y2'},
'Type_C': {'ID': 2, 1: ' x3', 2: ' y3'}}

(我不知道你想要 ID 键的值,所以我使用 range(0, 3) 来生成序号,我在中使用了编号 x, y我的 CSV 文件以区分列。)


附录 1:

如果我正确理解你编辑的问题,你想要别的东西,所以我代码的最后一部分可能是

result = {}
for col, lt in zip(df.columns, lst):
    result[col] = {'ID': 'Value'}
    result[col].update(lt)
result

给出 result:

{'Type_A': {'ID': 'Value', 1: 'x1', 2: 'y1'},
'Type_B': {'ID': 'Value', 1: ' x2', 2: ' y2'},
'Type_C': {'ID': 'Value', 1: ' x3', 2: ' y3'}}


附录 2:

或者您想要其他东西 - 所以不要使用 附录 1 中的命令 这个命令(目录理解)

result = {col: [('ID', 'Value')] + lt for col, lt in zip(df.columns, lst)}

给出 result:

{'Type_A': [('ID', 'Value'), (1, 'x1'), (2, 'y1')],
'Type_B': [('ID', 'Value'), (1, ' x2'), (2, ' y2')],
'Type_C': [('ID', 'Value'), (1, ' x3'), (2, ' y3')]}