我有一个这种格式的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