我有以下df:
id1 id2 id3(expected_col)
21 4 21a
21 4 21a
21 4 21a
21 5 21b
22 6 22a
22 6 22a
22 6 22a
23 7 23a
23 7 23a
23 8 23b
23 9 23c
有两列-id1和id2,我想创建一个新列,生成id3,这是前两列的哪种组合。
整数部分与id1列相同,但我想添加在 id2 更改时更改的字符串,然后字母周期再次以" a"每当遇到新的 id1 时。
所以也许我们可以通过id1然后执行其余的操作,但我不知道如何为新列生成字符串字母表。在上面的df中,id3是我期望的结果列。
如果有任何不清楚的地方,请告诉我。
答案 0 :(得分:1)
使用GroupBy-Apply方法,在{id2'的组级别使用shift
,ne
和cumsum
来确定更改,然后针对ascii_lowercase
进行映射字母。
from string import ascii_lowercase
def combine_ids(grp, letters):
grp = grp.ne(grp.shift()).cumsum() - 1
return str(grp.name) + grp.map(letters)
letters = pd.Series(list(ascii_lowercase))
df['id3'] = df.groupby('id1')['id2'].apply(combine_ids, letters)
以上假设您最多只需要附加26个字母。如果你需要更多,你可以使用类似下面的程序添加重复的字母'aa' - 'zz':
from itertools import product
from string import ascii_lowercase
doubles = map(''.join, product(ascii_lowercase, repeat=2))
letters = pd.Series(list(ascii_lowercase) + list(doubles))
结果输出:
id1 id2 id3
0 21 4 21a
1 21 4 21a
2 21 4 21a
3 21 5 21b
4 22 6 22a
5 22 6 22a
6 22 6 22a
7 23 7 23a
8 23 7 23a
9 23 8 23b
10 23 9 23c