pandas 如何在DataFrame中展开数组列、应用函数并恢复结构?

nxowjjhe  于 2022-12-16  发布在  其他
关注(0)|答案(1)|浏览(225)

我有一个DataFrame,它有两列,第二列包含形状不同的numpy数组(这里是:(2, 1)(2, 2)(2, 3))。示例:

  1. class data
  2. 0 0 [[3], [17]]
  3. 1 1 [[9, 5], [8, 19]]
  4. 2 1 [[8, 16, 13], [17, 19, 10]]

现在我想将data列扁平化以得到一个1D数组[3, 17, 9, 5, 8, 19, 8, 16, 13, 17, 19, 10],对这个向量应用一个函数,并恢复DataFrame的原始形状。例如,如果我想从所有元素中减去向量的平均值,所需的输出如下:

  1. class data
  2. 0 0 [[-9], [5]]
  3. 1 1 [[-3, -7], [-4, 7]]
  4. 2 1 [[-4, 4, 1], [5, 7, -2]]

如何才能最好地实现这种转变?
编辑@mozway:
我生成的DataFrame如下所示:

  1. data = []
  2. np.random.seed(8)
  3. for i in range(1, 4):
  4. data.append(np.random.randint(0, 20, (2, i)))
  5. category = {"class": [0, 1, 1]}
  6. df = pd.DataFrame(category)
  7. df["data"] = data

用于变换前面提到的1D阵列的函数将是arr -= np.mean(arr)

liwlm1x9

liwlm1x91#

假设flat是一个数组,如下所示:

  1. [-9. 5. -3. -7. -4. 7. -4. 4. 1. 5. 7. -2.]

一种办法可以是:

  1. def nested_unflatten(da, placeholder):
  2. res = []
  3. for e in placeholder:
  4. if isinstance(e, Iterable):
  5. res.append(nested_unflatten(da, e))
  6. else:
  7. res.append(next(da))
  8. return res
  9. flat = np.array([-9., 5., -3., -7., -4., 7., -4., 4., 1., 5., 7., -2.])
  10. un_flat = nested_unflatten(iter(flat), df["data"])
  11. print(un_flat)

产出

  1. [[[-9.0], [5.0]], [[-3.0, -7.0], [-4.0, 7.0]], [[-4.0, 4.0, 1.0], [5.0, 7.0, -2.0]]]

如果您还对flatten函数感兴趣:

  1. def flatten(da):
  2. res = []
  3. for e in da:
  4. if isinstance(e, Iterable):
  5. res.extend(flatten(e))
  6. else:
  7. res.append(e)
  8. return res

它可用于从示例中获取flat,如下所示:

  1. flat = np.array(flatten(df["data"]), dtype=np.float64)
  2. flat -= np.mean(flat)
展开查看全部

相关问题