2017-06-23 108 views
2

我有以下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 

有两个columns- ID1和ID2,我想创建一个新的生产塔ID3哪种前两列的组合。

的整数部分是一样的ID1列,但我想添加字符串,它改变每当ID2更改,然后按字母排列的周期,“一”每当新遇到ID1重新开始。

所以,也许我们可以grouby id1,然后执行其余的操作,但我不知道如何生成新列的字符串字母。在上面的df id3是我期望的结果列。

请让我知道,如果有什么不清楚。

回答

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 
+0

非常感谢你,这是完美的! – Liza

相关问题