首页 > 解决方案 > 从长度不均匀的字典创建熊猫数据框

问题描述

对于字典:

d = {
    "a": [1],
    "b": 2,
    "c": [[7, 8, 9], ["a", "b", "c"], [9, 10, 11]],
    "d": None,
}

我想实现这个数据框:

pd.DataFrame({"a": [[1], [1], [1]],
              "b": [2, 2, 2],
              "c": [[7, 8, 9], ["a", "b", "c"], [9, 10, 11]],
              "d": [None, None, None]})
     a  b            c     d
0  [1]  2    [7, 8, 9]  None
1  [1]  2    [a, b, c]  None
2  [1]  2  [9, 10, 11]  None

基本上,列应该复制自己,直到最长列的长度。

我知道在 R 中,如果我创建一个类似 with 的数据框NA来指示我想要复制和使用的行tidyr::fill,python 中是否有类似的东西?

df = data.frame(
  a = c("a", NA, NA),
  b = c(1, 2, 3)
)
tidyr::fill(df, a)
  a b
1 a 1
2 a 2
3 a 3

标签: pythonrpandasdataframetidyverse

解决方案


以下是可能解决方案的示例:

d = {
    "a": [1],
    "b": 2,
    "c": [[7, 8, 9], ["a", "b", "c"], [9, 10, 11]],
    "d": None,
}

max_len = max(len(l) if isinstance(l, list) else 1 for l in d.values())

for key in d.keys():
  if isinstance(d[key], list):
    if len(d[key]) != max_len:
      d[key] = np.repeat(d[key], max_len).tolist()
  else:
    d[key] = np.repeat(np.array(d[key]), max_len).tolist()

结果:

{
 'a': [1, 1, 1],
 'b': [2, 2, 2],
 'c': [[7, 8, 9], ['a', 'b', 'c'], [9, 10, 11]],
 'd': [None, None, None]
}

但它显然只适用于特定情况,当除一个之外的所有列都只有一个元素时。为了解决这个任务,通常还应该指定如何处理不同长度的列:是否应该重复整个列并在最后一次迭代时修剪剩余的列,或者应该只重复第一个/最后一个值,或者其他一些方法。


推荐阅读