2017-09-26 69 views
3

對於數據框中的每一行,我希望使用附加列創建它的重複項以標識每個重複項。複製數據幀中的每一行並進行計數

E.g原始數據幀是

A | A 

B | B 

我願每一行的化妝重複使用的附加列來識別它。導致:

A | A | 1 

A | A | 2 

B | B | 1 

B | B | 2 
+1

似乎是np.repeat和統計工作。 –

回答

3

您可以使用df.reindex接着是groupbydf.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 

類似地,使用reindexassignnp.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 
+0

真棒,第一個解決方案爲我工作。 – mlwh

+0

@mlwh太棒了!如果您決定使用它,請隨時[標記爲](https://stackoverflow.com/help/someone-answers)。 –

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

設置
從@jezrael

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

    a b 
0 A A 
1 B B 

溶液1
創建pd.MultiIndexpd.MultiIndex.from_product
然後使用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 
0

使用pd.concat()重複,然後GROUPBYcumcount()數:

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 
相關問題