如何根据其他数据框列创建新的pandas列?

时间:2017-06-23 16:04:32

标签: python pandas numpy dataframe

我有以下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是我期望的结果列。

如果有任何不清楚的地方,请告诉我。

1 个答案:

答案 0 :(得分:1)

使用GroupBy-Apply方法,在{id2'的组级别使用shiftnecumsum来确定更改,然后针对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