定义一个新列,并根据Python中的每个组给出值

时间:2017-12-11 21:32:56

标签: python regex pandas

“考虑以下数据集:

a    b    c   
e1   21   99  
e1   21   99  
e2   22   99
e3   23   99
e1   23   99
e3   24   99
e4   27   99
e1   25   99
e2   29   99
e4   22   99
e2   23   99

我希望有一个基于“a”列的新列,如下所示:

a      b    c    d
e_11   21   99   1
e_11   21   99   1
e_21   22   99   2
e_31   23   99   3
e_11   23   99   1
e_31   24   99   3
e_41   27   99   4
e_11   25   99   1
e_21   29   99   2
e_41   22   99   4
e_21   23   99   2

我需要添加一个新列d,如果它们属于同一个组,则给出相同的值。 我不知道如何按每个组过滤我的数据,并为每个组设置相同的值。 这是我的代码,它没有给我正确的答案:

i=0
e=[]
 for name in df.groupby('a'):
  for j in range(len(name)):

    e.append(i)
 i++

df['d'] = pd.Series(e)
print(df)

1 个答案:

答案 0 :(得分:1)

一次性满足您的要求的一种方法是:

import regex as re

rx = re.compile(r'(?V1)(?<=[a-z])(?=\d+)')
def splitter(row):
    (char, number) = rx.split(row['a'])
    return pd.Series({'a': '{}_{}{}'.format(char, number, number), 'd': number})

df[['a', 'd']] = df.apply(splitter, axis = 1)

<小时/> 哪个使用df.head()

    a       b   c   d
0   e_11    21  99  1
1   e_11    21  99  1
2   e_22    22  99  2
3   e_33    23  99  3
4   e_11    23  99  1

<小时/> 这里的想法是设置一个splitter函数,它在字母和数字之间进行分割。该函数按行方式应用并返回新列。您需要较新的regex模块才能使空分割生效。