给定一个dict:
{1: [1,2,3,4,5], 2: [55,22,112]}
我想构建一个数据帧:
key_id ids
1 1
1 2
1 3
1 4
1 5
2 55
2 22
2 112
我该怎么做?我正在尝试使用pd.DataFrame.from_dict()
,但这似乎不是正确的方法。还尝试运行dict,并使用与值列表长度相同的键创建一个列表。有什么有效的方法可以做到这一点吗?
p.S有时它将是一个数据帧作为值:
{0: pd.DataFrame({'id': {0: 3}})}
我认为简单的列表理解就足够了:
pd.DataFrame(
[(k, i) for k, v in d.items() for i in v],
columns=['key_id', 'ids']
)
key_id ids
0 1 1
1 1 2
2 1 3
3 1 4
4 1 5
5 2 55
6 2 22
7 2 112
这里有一个我刚刚想到的解决方案(可能不是最好的(:
df = (pd.json_normalize(d).T
.reset_index()
.explode(0)
.reset_index(drop=True)
.set_axis(['key_id', 'ids'], axis=1)
)
输出:
>>> df
key_id ids
0 1 1
1 1 2
2 1 3
3 1 4
4 1 5
5 2 55
6 2 22
7 2 112
您可以使用Series和explode
:
d = {1: [1,2,3,4,5], 2: [55,22,112]}
df = (
pd.Series(d, name='ids')
.explode()
.rename_axis('key_ids').reset_index()
)
输出:
key_ids ids
0 1 1
1 1 2
2 1 3
3 1 4
4 1 5
5 2 55
6 2 22
7 2 112
另一种方法是使用列表comp&分配
df = pd.concat([pd.DataFrame({'ids' : v}
).assign(key_ids=k) for k,v in d.items()])[['key_ids', 'ids']]
print(df)
key_ids ids
0 1 1
1 1 2
2 1 3
3 1 4
4 1 5
0 2 55
1 2 22
2 2 112