如何将字典转换为 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
的键是 tuple
s,第一个元素给出属性,第二个元素是 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'
)
我正在处理不同属性(例如 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
的键是 tuple
s,第一个元素给出属性,第二个元素是 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'
)