是否将dict转换为每个值都有重复键的数据帧



给定一个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

最新更新