如何在DataFrame扁列数组,应用一个函数,并恢复结构?



我有一个DataFrame,如下所示。有两列,其中第二列包含形状不同的numpy数组(这里:(2, 1),(2, 2),(2, 3))。例子:

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

我现在想平坦data列以获得1D数组[3, 17, 9, 5, 8, 19, 8, 16, 13, 17, 19, 10],对该向量应用函数,并恢复DataFrame的原始形状。例如,如果我想从所有元素中减去向量的平均值,期望的输出是:

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

我怎样才能最好地实现这种转变?

编辑@mozway:

我生成了这样的DataFrame:

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

前面提到的变换一维数组的函数是arr -= np.mean(arr)

假设flat为数组,如下所示:

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

一种方法是:

def nested_unflatten(da, placeholder):
res = []
for e in placeholder:
if isinstance(e, Iterable):
res.append(nested_unflatten(da, e))
else:
res.append(next(da))
return res

flat = np.array([-9.,  5., -3., -7., -4.,  7., -4.,  4.,  1.,  5.,  7., -2.])
un_flat = nested_unflatten(iter(flat), df["data"])
print(un_flat)

[[[-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函数感兴趣:

def flatten(da):
res = []
for e in da:
if isinstance(e, Iterable):
res.extend(flatten(e))
else:
res.append(e)
return res

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

flat = np.array(flatten(df["data"]), dtype=np.float64)
flat -= np.mean(flat)

最新更新