“考虑以下数据集:
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)
答案 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
模块才能使空分割生效。