如何将字典转换为 pandas 多索引数据框

How to convert a dict into a pandas multiindex dataframe

我正在处理不同属性(例如 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 但我没有得到可用的格式。

关于如何处理这个问题或以不同方式存储距离数据的任何建议?

我觉得数据格式没问题。你只需要正确解压它就可以得到一个可用的数据框。

  • 从字典值和字典键构建数据框。
  • 将包含元素名称的索引级别解压缩为两列。
  • 应用具有适当索引和列的交叉表(对结果应用 .fillna(0) 以获得与您的问题完全相同的结构)。
<pre><code>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' )