简单字典:
d = {'a': set([1,2,3]), 'b': set([3, 4])}
(如果重要的话,集合可以变成列表)
如何将其转换为长/整洁的 DataFrame
,其中每一列都是一个变量,每个观察值都是一行,即:
letter value
0 a 1
1 a 2
2 a 3
3 b 3
4 b 4
下面是可行的,但是有点麻烦:
id = 0
tidy_d = {}
for l, vs in d.items():
for v in vs:
tidy_d[id] = {'letter': l, 'value': v}
id += 1
pd.DataFrame.from_dict(tidy_d, orient = 'index')
是否有任何 pandas
魔术可以做到这一点?像这样的东西:
pd.DataFrame([d]).T.reset_index(level=0).unnest()
unnest
显然不存在并且来自 R。
最佳答案
您可以使用 itertools.chain
和 zip
的理解:
from itertools import chain
keys, values = map(chain.from_iterable, zip(*((k*len(v), v) for k, v in d.items())))
df = pd.DataFrame({'letter': list(keys), 'value': list(values)})
print(df)
letter value
0 a 1
1 a 2
2 a 3
3 b 3
4 b 4
这可以以更具可读性的方式重写:
zipper = zip(*((k*len(v), v) for k, v in d.items()))
values = map(list, map(chain.from_iterable, zipper))
df = pd.DataFrame(list(values), columns=['letter', 'value'])
关于python - pandas:当值是可变长度的集合或列表时,从字典创建一个长/整齐的 DataFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52626655/