Python 按列值复制数据帧中的行

Python 按列值复制数据帧中的行,python,pandas,Python,Pandas,我想复制数据帧中的行。每行应重复n次,其中n是每行的字段 import pandas as pd what_i_have = pd.DataFrame(data={ 'id': ['A', 'B', 'C'], 'n' : [ 1, 2, 3], 'v' : [ 10, 13, 8] }) what_i_want = pd.DataFrame(data={ 'id': ['A', 'B', 'B', 'C', 'C', 'C'], 'v' : [ 10,

我想复制数据帧中的行。每行应重复n次,其中n是每行的字段

import pandas as pd

what_i_have = pd.DataFrame(data={
  'id': ['A', 'B', 'C'],
  'n' : [  1,   2,   3],
  'v' : [ 10,  13,   8]
})

what_i_want = pd.DataFrame(data={
  'id': ['A', 'B', 'B', 'C', 'C', 'C'],
  'v' : [ 10,  13,  13,   8,   8,   8]
})

这可能吗?

您可以使用
np.repeat
获取重复索引,然后使用该索引将其索引到帧中:

>>> df2 = df.loc[np.repeat(df.index.values,df.n)]
>>> df2
  id  n   v
0  A  1  10
1  B  2  13
1  B  2  13
2  C  3   8
2  C  3   8
2  C  3   8
之后,只需做一点清理工作:

>>> df2 = df2.drop("n",axis=1).reset_index(drop=True)
>>> df2
  id   v
0  A  10
1  B  13
2  B  13
3  C   8
4  C   8
5  C   8
请注意,如果您可能需要担心重复的索引,您可以使用
.iloc

In [86]: df.iloc[np.repeat(np.arange(len(df)), df["n"])].drop("n", axis=1).reset_index(drop=True)
Out[86]: 
  id   v
0  A  10
1  B  13
2  B  13
3  C   8
4  C   8
5  C   8

它使用的是位置,而不是索引标签。

您可以使用
set\u index
repeat

In [1057]: df.set_index(['id'])['v'].repeat(df['n']).reset_index()
Out[1057]:
  id   v
0  A  10
1  B  13
2  B  13
3  C   8
4  C   8
5  C   8

细节

In [1058]: df
Out[1058]:
  id  n   v
0  A  1  10
1  B  2  13
2  C  3   8

这不是最好的解决方案,但我想与大家分享:您也可以使用
pandas.reindex()
.repeat()

输出:


   id   v
0   A   10
1   B   13
1   B   13
2   C   8
2   C   8
2   C   8
  id   v
0  A  10
1  B  13
1  B  13
2  C   8
2  C   8
2  C   8

您可以进一步附加
.reset\u index(drop=True)
以重置
.index

它类似于
第三天中的
取消计数:

我编写了一个实现此API的包():

从数据导入f
从datar.tibble导入tribble
从datar.tidyr导入取消计数
我所拥有的=tribble(
f、 身份证,f.n,f.v,
“A”,1,10,
“B”,2,13,
“C”,3,8
)
我有什么>>解开(f.n)
输出:


   id   v
0   A   10
1   B   13
1   B   13
2   C   8
2   C   8
2   C   8
  id   v
0  A  10
1  B  13
1  B  13
2  C   8
2  C   8
2  C   8

有什么理由这样做吗?我认为数据重复是最好避免的。这是一个中间步骤-我根据概率分布生成“v”列,然后我将通过随机选择另一个数据集中的行来添加另一列。但我仍然不认为有理由不直接这样做。但我需要更多关于你真正想要达到的目标的信息。不确定你这里所说的“直接做”是什么意思?不过,被接受的答案正是我想要的。在将因子转换为虚拟变量之前,我正在使用这个中间步骤。在较新的版本中,可以是
df.loc[df.index.repeat(df.n)]