我有一个带有一些复制行的数据帧
item h2 h3 h4
----------------
foo v1 ... ...
foo v2 ... ...
foo v1 ... ...
foo v2 ... ...
foo v1 ... ...
foo v2 ... ...
foo v1 ... ...
foo v2 ... ...
bar v5 ... ...
bar v6 ... ...
bar v7 ... ...
bar v5 ... ...
bar v6 ... ...
bar v7 ... ...
我的目标是在这个数据帧中添加一列(new_id
(,它指示重复块(块是一组具有相同item
名称的行(的递增计数,前缀是item
列中的值(如果有帮助,复制的块将是连续的(
item h2 h3 h4 new_id
-----------------------
foo v1 ... ... foo1
foo v2 ... ... foo1
foo v1 ... ... foo2
foo v2 ... ... foo2
foo v1 ... ... foo3
foo v2 ... ... foo3
foo v1 ... ... foo4
foo v2 ... ... foo4
bar v5 ... ... bar1
bar v6 ... ... bar1
bar v7 ... ... bar1
bar v5 ... ... bar2
bar v6 ... ... bar2
bar v7 ... ... bar2
关于如何做到这一点的建议?
使用str.cat()
将item
列与h2
中各组的累积计数连接起来。显然,累积计数从零开始,将其偏移1
df.item.str.cat((df.groupby('h2').cumcount()+1).astype(str),sep='')
item h2 h3 h4 new_id
0 foo v1 ... ... foo1
1 foo v2 ... ... foo1
2 foo v1 ... ... foo2
3 foo v2 ... ... foo2
4 foo v1 ... ... foo3
5 foo v2 ... ... foo3
6 foo v1 ... ... foo4
7 foo v2 ... ... foo4
8 bar v5 ... ... bar1
9 bar v6 ... ... bar1
10 bar v7 ... ... bar1
11 bar v5 ... ... bar2
12 bar v6 ... ... bar2
13 bar v7 ... ... bar2
通过列item
和h2
:使用GroupBy.cumcount
df['new_id'] = df['item'] + '_' + df.groupby(['item','h2']).cumcount().add(1).astype(str)
print (df)
item h2 h3 h4 new_id
0 foo v1 ... ... foo_1
1 foo v2 ... ... foo_1
2 foo v1 ... ... foo_2
3 foo v2 ... ... foo_2
4 foo v1 ... ... foo_3
5 foo v2 ... ... foo_3
6 foo v1 ... ... foo_4
7 foo v2 ... ... foo_4
8 bar v5 ... ... bar_1
9 bar v6 ... ... bar_1
10 bar v7 ... ... bar_1
11 bar v5 ... ... bar_2
12 bar v6 ... ... bar_2
13 bar v7 ... ... bar_2