python - pandas:当值是可变长度的集合或列表时,从字典创建一个长/整齐的 DataFrame

标签 python pandas unnest

简单字典:

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.chainzip 的理解:

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/

相关文章:

oracle - Jooq 解析 unnest/table 来联合所有 (Oracle)

Python 格式化 float ,如 Fortran

python:从 Pandas 中的数据框生成的列表比数据框列长得多

python - os.path.isdir() 在无法访问但存在的目录上返回 false

python - 将数据源信息附加到 pandas 系列

sql - 将多维数组转换为记录

python - 保持azure管道作业中的postgres docker容器运行

python - 如何在不同大小的数据帧之间使用 np.where ? 'operands could not be broadcast together'

python - 将列表从一个 Dataframe 行映射到另一个 Dataframe 行的矢量化方法

sql - 在 SQL (Athena) 中取消嵌套 : How to convert array of structs into an array of values plucked from the structs?