通过列值复制pandas数据框中的行,并添加一个新列作为重复索引。

7

我有一个数据框,想要将数据框的每一行重复 k 次。同时,我还想创建一个列,该列的值为 0k-1

和这里提出的问题类似:here

import pandas as pd

df = 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'],
  'n' : [ 1, 2, 2, 3, 3, 3],
  'v' : [ 10,  13, 13, 8, 8, 8],
  'repeat_id': [0, 0, 1, 0, 1, 2]
})

以下命令完成了一半的工作。我正在寻找Pandas的方法来添加repeat_id列。

df.loc[df.index.repeat(df.n)]

2
你的“一半工作”正是我所需要的! - user1718097
1个回答

4

使用GroupBy.cumcountcopy来避免SettingWithCopyWarning警告:

如果您稍后修改df1中的值,您会发现这些修改不会传播回原始数据(df),并且Pandas会发出警告。

df1 = df.loc[df.index.repeat(df.n)].copy()
df1['repeat_id'] = df1.groupby(level=0).cumcount()
df1 = df1.reset_index(drop=True)
print (df1)
  id  n   v  repeat_id
0  A  1  10          0
1  B  2  13          0
2  B  2  13          1
3  C  3   8          0
4  C  3   8          1
5  C  3   8          2

1
谢谢您的快速回复!显然我只能在10分钟后接受答案 :D - kampta
@kampta - 真的是一个非常好的问题(输入、数据、输出数据、你尝试了什么),不幸的是这些天在SO上并不经常见到这样的问题... - jezrael
如果你不使用copy()会发生什么?我很难看出这样做的问题在哪里。 - FHTMitchell
@FHTMitchell - 我收到了 `SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value insteadSee the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy` 的警告信息。 - jezrael
@jezrael 是的,我也收到了那个警告。不过我还是继续操作了,df 没有出现任何问题。很奇怪。 - FHTMitchell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接