如何将字典转换为pandas数据帧,其中键和值位于两列中



我有一个这种格式的python字典。

d = {1: {1, 2, 3},
2: {4, 5}}

我想把它转换成这种格式的pandas数据帧。

Expected Output:
Source      Target
1           1
1           2
1           3
2           4
2           5

我试着用列表理解来做这件事

d = {1: {1, 2, 3}, 2: {4, 5}}
df=pd.DataFrame([[key,v] for key, value in d.items() for v in value], columns=["Source", "Target"])
print(df)

但是,还有更好的方法吗?

您可以使用df.explode:

import pandas as pd
d = {
1: {1, 2, 3},
2: {4, 5}
}
df = pd.DataFrame(d.items(), columns=['Source', 'Target'])
df = df.explode('Target')

这就产生了

Source Target
0       1      1
0       1      2
0       1      3
1       2      4
1       2      5

在这里,我们为每个Target创建具有多个值的数据帧,然后分解为target中的每个值创建一个新行。

请注意,索引仍然反映原始数据帧,因此我们可以使用:

df = df.reset_index(drop=True)

将其重置为

Source Target
0       1      1
1       1      2
2       1      3
3       2      4
4       2      5

哪个组合给了我们

df = df.explode('Target').reset_index(drop=True)

您可以从字典中的每个键:值对创建DataFrame,然后将它们一起concat

import pandas as pd
pd.concat([pd.DataFrame({'Source': k, 'Target': tuple(v)}) for k,v in d.items()],
ignore_index=True)

或者,您可以使用pd.DataFrame.from_dict构造函数和stack,并对进行一系列重命名

(pd.DataFrame.from_dict(d, orient='index')
.stack()
.reset_index(-1, drop=True)
.rename('Target').rename_axis(index='Source')
.reset_index()
.astype(int))

Source  Target
0       1       1
1       1       2
2       1       3
3       2       4
4       2       5

最新更新