我有以下 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更改时更改的字符串,然后每当遇到新的id1时,字母循环再次以“a”开始。
所以也许我们可以对 id1 进行分组,然后执行其余的操作,但我不确定如何为新列生成字符串字母表。在上面的 df id3 是我期望的结果列。
如果有任何不清楚的地方,请告诉我。
使用的GroupBy-应用方法,将具有shift
,ne
和cumsum
在上“ID2”的组水平用于确定的改变,然后针对映射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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句