根据数字和组 ID (Python 3) 扩展 pandas 数据框行。
Expanding pandas Data Frame rows based on number and group ID (Python 3).
我一直在努力寻找一种方法来根据预先确定的数字和分组变量 (id) expand/clone 观察行。对于上下文,这是一个使用 pandas 和 numpy (python3) 的示例数据框。
df = pd.DataFrame([[1, 15], [2, 20]], columns = ['id', 'num'])
df
Out[54]:
id num
0 1 15
1 2 20
我想根据 "num" 变量中给定的编号 expand/clone 行,基于它们的 ID 组。在这种情况下,我想要 id = 1 的 15 行和 id = 2 的 20 行。这可能是一个简单的问题,但我正在努力完成这项工作。我一直在弄乱 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
再次抱歉,如果这是一个愚蠢的问题,请提前感谢您的帮助。
我无法复制你的索引,但我可以复制你的值,使用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
将idx
分配给df
的索引-
df.index = idx
我一直在努力寻找一种方法来根据预先确定的数字和分组变量 (id) expand/clone 观察行。对于上下文,这是一个使用 pandas 和 numpy (python3) 的示例数据框。
df = pd.DataFrame([[1, 15], [2, 20]], columns = ['id', 'num'])
df
Out[54]:
id num
0 1 15
1 2 20
我想根据 "num" 变量中给定的编号 expand/clone 行,基于它们的 ID 组。在这种情况下,我想要 id = 1 的 15 行和 id = 2 的 20 行。这可能是一个简单的问题,但我正在努力完成这项工作。我一直在弄乱 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
再次抱歉,如果这是一个愚蠢的问题,请提前感谢您的帮助。
我无法复制你的索引,但我可以复制你的值,使用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
将idx
分配给df
的索引-
df.index = idx