【问题标题】:How to convert a dict into a pandas multiindex dataframe如何将 dict 转换为 pandas 多索引数据框
【发布时间】:2021-10-08 10:15:59
【问题描述】:

我正在处理具有不同属性(例如 A、B、...)的元素(例如 a1、a2、...)之间的距离,我选择 dict 来存储距离。 dict 具有以下形式:

mydict = {('A', ('a1','a2')): 1.0,
          ('A', ('a1','a3')): 0.5,
          ('A', ('a2','a1')): 1.1,
          ('A', ('a2','a3')): 0.8,
          ('A', ('a3','a1')): 1.2,
          ('A', ('a3','a2')): 1.2,
          ('B', ('b1','b2')): 1.0,
          ('B', ('b1','b3')): 0.5,
          ('B', ('b2','b1')): 1.1,
          ('B', ('b2','b3')): 0.8,
          ('B', ('b3','b1')): 1.2,
          ('B', ('b3','b2')): 1.2,
          }

所以dict 的键是tuples,第一个元素给出属性,第二个元素通过tuple 本身给出这两个元素,其距离在相应的值中给出。

现在我想以交叉表的形式显示数据,看起来应该像这样:

A   a1   a2   a3
a1    0  1.0   0.5
a2  1.1    0   0.8
a3  1.2  1.2    0

B   b1   b2   b3
b1    0  1.0   0.5
b2  1.1    0   0.8
b3  1.2  1.2    0

每个属性以此类推。

我试图将数据转换为DataFrame,以便使用pandas 的casstab 函数。我尝试将 dict 的键转换为列表并使用pandas.MultiIndex.from_tuples,然后使用MultiIndex.to_frame,但我没有得到可用的格式。

对于如何处理这个问题或以不同的方式存储距离数据有什么建议吗?

【问题讨论】:

  • 请提供可复制的词典样本

标签: python pandas crosstab


【解决方案1】:

我认为数据的格式很好。您只需要正确解包即可获得可用的数据框。

  • 根据 dict 值和 dict 键构造数据框。
  • 将带有元素名称的索引级别解压缩到两列。
  • 使用适当的索引和列应用交叉表(将.fillna(0) 应用于结果以获得与您的问题完全相同的结构)。
df = pd.DataFrame(my_dict.values(), pd.MultiIndex.from_tuples(my_dict.keys()))
df[['first_element', 'second_element']] = df.index.get_level_values(1).to_list()
pd.crosstab(
            [df.index.get_level_values(0), df.first_element],
            df.second_element,
            values=df[0],
            aggfunc='sum'
            )

【讨论】:

  • 感谢您的快速响应。如果有多个属性,您的代码会生成一个非常稀疏的大交叉表(当然,这也可能是一个理想的输出)。对于我的用例,我能够使用您的代码 sn-ps 并创建一个函数,该函数返回任何给定属性的交叉表。再次感谢!
  • 嘿,不客气。您可以通过应用.loc['A'] 在大交叉表中访问单个属性,例如“A”
猜你喜欢
  • 2021-08-07
  • 2021-10-15
  • 2020-07-11
  • 2022-08-11
  • 1970-01-01
  • 2018-06-03
  • 2016-04-26
  • 2017-04-01
  • 2019-09-27
相关资源
最近更新 更多