對於數據框中的每一行,我希望使用附加列創建它的重複項以標識每個重複項。複製數據幀中的每一行並進行計數
E.g原始數據幀是
A | A
B | B
我願每一行的化妝重複使用的附加列來識別它。導致:
A | A | 1
A | A | 2
B | B | 1
B | B | 2
對於數據框中的每一行,我希望使用附加列創建它的重複項以標識每個重複項。複製數據幀中的每一行並進行計數
E.g原始數據幀是
A | A
B | B
我願每一行的化妝重複使用的附加列來識別它。導致:
A | A | 1
A | A | 2
B | B | 1
B | B | 2
您可以使用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
真棒,第一個解決方案爲我工作。 – mlwh
@mlwh太棒了!如果您決定使用它,請隨時[標記爲](https://stackoverflow.com/help/someone-answers)。 –
使用Index.repeat
與loc
,用於計數groupby
與cumcount
:
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
設置
從@jezrael
df = pd.DataFrame({'a': ['A', 'B'], 'b': ['A', 'B']})
a b
0 A A
1 B B
溶液1
創建pd.MultiIndex
與pd.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使用相同的loc
和reindex
概念,但通過使用list
和int
乘法而不是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
使用pd.concat()重複,然後GROUPBY與cumcount()數:
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
似乎是np.repeat和統計工作。 –