Python 从csv文件为PyFrame构建嵌套数据帧或字典

Python 从csv文件为PyFrame构建嵌套数据帧或字典,python,python-3.x,pandas,visualization,Python,Python 3.x,Pandas,Visualization,我有一个以下格式的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

我有一个以下格式的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
我想我所需要做的就是读取列表中的每一列,然后在将其合并到字典或嵌套数据框中之前添加索引

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
这就是我将它们存储在列表中所做的

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()
然后添加用于枚举()的索引

现在,接下来我向dataframe添加了标签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
,而不是您的
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
结果的值将为

{'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键需要哪个值,所以我使用
范围(0,3)
来生成序列号,并在我的
CSV
文件中使用编号
x
y
来区分列。)


附录1:

如果我正确理解了您编辑的问题,则您需要其他内容,因此我的代码的最后一部分可能是

result = {}
for col, lt in zip(df.columns, lst):
    result[col] = {'ID': 'Value'}
    result[col].update(lt)
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中的命令,而只使用 这是一个命令(目录理解)

给出
结果

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


你能让你的键值对独一无二,这样我们就可以看到一个模式吗?可能
x1、x2、x3
y1、y2、y3
?实际上,所有x都是相同的值,所有y也都是相同的值,但是在某些情况下,其中一个x可能是NaN。将其视为3个集合,集合A、集合B和集合C都可以具有相同的成员,但偶尔其中一个集合可能缺少一个成员,在这种情况下,其加载为NaN。我正在尝试构建这条dict,以使用它来帮助可视化集合之间的重叠。我认为我已经在某种程度上解决了问题,并编辑了问题以反映我的进度。为了更清晰,我编辑了原始问题,我对python非常陌生,所以请原谅我的命名错误。以当前答案无效的方式编辑您的原始问题不是一件很好的事情。我建议您将当前问题复制/粘贴为新问题,然后恢复此问题中的更改。我在答复中为您更改的请求编写了附录1和附录2。
result = {}
for col, lt in zip(df.columns, lst):
    result[col] = {'ID': 'Value'}
    result[col].update(lt)
result
result = {col: [('ID', 'Value')] + lt for col, lt in zip(df.columns, lst)}