【问题标题】:Building nested dataframe or dictionary from csv file for pyupset从 csv 文件为 pyupset 构建嵌套数据框或字典
【发布时间】:2017-12-05 14:26:52
【问题描述】:

我有一个格式如下的 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 和 Value 添加到数据框

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

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

【问题讨论】:

  • 您能否使您的键值对独一无二,以便我们看到一个模式?也许x1,x2,x3y1,y2,y3
  • 实际上所有的 x 都是相同的值,所有的 y 也是相同的值,但是在某些情况下 x 之一可能是 NaN。将其视为 3 个集合,集合 A、集合 B 和集合 C 都可能具有相同的成员,但有时其中一个集合可能缺少一个成员,在这种情况下,它被加载为 NaN。我正在尝试构建此 dict 以在 PyUpset 中使用它,这有助于可视化集合之间的重叠。
  • 我认为我已经在一定程度上解决了问题并编辑了问题以反映我的进度

标签: python python-3.x pandas visualization


【解决方案1】:

首先,而不是你的

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))

(即列表的列表;我选择了更合适的名称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) 生成序列号,并在我的 CSV 文件中使用编号为 xy 来区分列。)


附录 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': '值', 1: 'x2', 2: 'y2'},
'Type_C': {'ID': '值', 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')]}

【讨论】:

  • 为了更清楚起见,我已经编辑了原始问题,我对 python 很陌生,所以请原谅我的错误命名法。
  • 当前答案无效的方式编辑您的原始问题并不是一件好事。我建议您将当前问题复制/粘贴为 new 问题,然后恢复 this 中的更改。
  • 我写了 Addendum 1Addendum 2 在我对您更改请求的回答中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-16
  • 2022-01-13
  • 2017-07-25
  • 2016-11-22
  • 2021-02-20
相关资源
最近更新 更多