2

我一直在努力寻找一种基于预定数字和分组变量(id)来扩展/克隆观察行的方法。对于上下文,这是一个使用 pandas 和 numpy (python3) 的示例数据框。

df = pd.DataFrame([[1, 15], [2, 20]], columns = ['id', 'num'])

df
Out[54]:
  id  num
0   1   15
1   2   20 

我想根据 ID 组通过“num”变量中给出的数字来扩展/克隆行。在这种情况下,我想要 15 行 id = 1 和 20 行 id = 2。这可能是一个简单的问题,但我正在努力完成这项工作。我一直在搞乱 reindex 和 np.repeat,但概念上的部分不适合我。

在 R 中,我使用了 splitstackshape 包中的 expandRows 函数,它看起来像这样:

library(splitstackshape)

df <- data.frame(id = c(1, 2), num = c(15, 20))


df
  id num
1  1  15
2  2  20


df2 <- expandRows(df, "num", drop = FALSE)
df2
     id num
1     1  15
1.1   1  15
1.2   1  15
1.3   1  15
1.4   1  15
1.5   1  15
1.6   1  15
1.7   1  15
1.8   1  15
1.9   1  15
1.10  1  15
1.11  1  15
1.12  1  15
1.13  1  15
1.14  1  15
2     2  20
2.1   2  20
2.2   2  20
2.3   2  20
2.4   2  20
2.5   2  20
2.6   2  20
2.7   2  20
2.8   2  20
2.9   2  20
2.10  2  20
2.11  2  20
2.12  2  20
2.13  2  20
2.14  2  20
2.15  2  20
2.16  2  20
2.17  2  20
2.18  2  20
2.19  2  20

再次抱歉,如果这是一个愚蠢的问题,并提前感谢您的帮助。

4

1 回答 1

4

我无法复制您的索引,但我可以使用 复制您的值,np.repeat实际上很容易。

v = df.values
df = pd.DataFrame(v.repeat(v[:, -1], axis=0), columns=df.columns)

如果你想要确切的索引(虽然我看不出你为什么需要),你需要一个groupby操作 -

def f(x):
    return x.astype(str) + '.' + np.arange(len(x)).astype(str)

idx = df.groupby('id').id.apply(f).values

分配idxdf的索引 -

df.index = idx
于 2017-12-28T17:54:54.440 回答