使用计数复制数据框中的每一行

时间:2017-09-26 09:11:39

标签: python pandas dataframe duplicates

对于数据框中的每一行,我希望创建一个副本,并附加一列来标识每个副本。

E.g原始数据框是

A | A 

B | B 

我希望使用附加列制作每行的副本以识别它。导致:

A | A | 1

A | A | 2

B | B | 1

B | B | 2

4 个答案:

答案 0 :(得分:3)

您可以在df.reindex上使用 groupby ,然后使用 df.index

df = df.reindex(df.index.repeat(2))
df['count'] = df.groupby(level=0).cumcount() + 1
df = df.reset_index(drop=True)

df
   a  b  count
0  A  A      1
1  A  A      2
2  B  B      1
3  B  B      2

同样,使用 reindex assign np.tile

df = df.reindex(df.index.repeat(2))\
       .assign(count=np.tile(df.index, 2) + 1)\
       .reset_index(drop=True)

df

   a  b  count
0  A  A      1
1  A  A      2
2  B  B      1
3  B  B      2

答案 1 :(得分:2)

Index.repeatloc一起使用,groupbycumcount一起使用:

df = pd.DataFrame({'a': ['A', 'B'], 'b': ['A', 'B']})
print (df)
   a  b
0  A  A
1  B  B

df = df.loc[df.index.repeat(2)]
df['new'] = df.groupby(level=0).cumcount() + 1
df = df.reset_index(drop=True)
print (df)
   a  b  new
0  A  A    1
1  A  A    2
2  B  B    1
3  B  B    2

或者:

df = df.loc[df.index.repeat(2)]
df['new'] = np.tile(range(int(len(df.index)/2)), 2) + 1
df = df.reset_index(drop=True)
print (df)
   a  b  new
0  A  A    1
1  A  A    2
2  B  B    1
3  B  B    2

答案 2 :(得分:2)

<强>设置
借用@jezrael

df = pd.DataFrame({'a': ['A', 'B'], 'b': ['A', 'B']})

   a  b
0  A  A
1  B  B

解决方案1 ​​
使用pd.MultiIndex.from_product创建pd.MultiIndex 然后使用pd.DataFrame.reindex

idx = pd.MultiIndex.from_product(
    [df.index, [1, 2]],
    names=[df.index.name, 'New']
)

df.reindex(idx, level=0).reset_index('New')

   New  a  b
0    1  A  A
0    2  A  A
1    1  B  B
1    2  B  B

解决方案2
这使用了@cᴏʟᴅsᴘᴇᴇᴅ和@jezrael使用的相同locreindex概念,但使用listint乘法而非np.tile简化了最终答案。

df.loc[df.index.repeat(2)].assign(New=[1, 2] * len(df))

   a  b  New
0  A  A    1
0  A  A    2
1  B  B    1
1  B  B    2

答案 3 :(得分:0)

使用 pd.concat()重复,然后使用 cumcount() groupby 来计算:

In [24]: df = pd.DataFrame({'col1': ['A', 'B'], 'col2': ['A', 'B']})

In [25]: df
Out[25]: 
  col1 col2
0    A    A
1    B    B

In [26]: df_repeat = pd.concat([df]*3).sort_index()

In [27]: df_repeat
Out[27]: 
  col1 col2
0    A    A
0    A    A
0    A    A
1    B    B
1    B    B
1    B    B

In [28]: df_repeat["count"] = df_repeat.groupby(level=0).cumcount() + 1

In [29]: df_repeat  # df_repeat.reset_index(drop=True); if index reset required.
Out[29]: 
  col1 col2  count
0    A    A      1
0    A    A      2
0    A    A      3
1    B    B      1
1    B    B      2
1    B    B      3