我在Pandas中有一个数据框,如下所示
df = pd.DataFrame({'Firstname':['Vishal', 'Nishal', 'Indira', 'Jagdish', 'Tamnna'], 'Actual Age':[25,33,58,58,30]})
Firstname Actual Age
0 Vishal 25
1 Nishant 33
2 Indira 58
3 Jagdish 58
4 Tamnna 30
和正则表达式:
\w+ish\w*
我似乎无法想象我们提供的结果如下:
Firstname Actual Age CopyDown
0 Vishal 25 Vishal
1 Nishant 33 Nishant
2 Indira 58 Nishant
3 Jagdish 58 Jagdish
4 Tamnna 30 Jagdish
所以基本上我要做的是查看Firstname列,如果我可以匹配给定的正则表达式,继续在新列中复制该值,直到找到下一个匹配,并且基本上继续这样做直到你得到到最后。
有什么想法吗?我已经坚持了几天。它基本上是我想要实现的copydown特性,它可能在非规范化数据集中有用。 (使用日期作为东西)
提前致谢
答案 0 :(得分:3)
您可以使用Series.str.extract("(\w+ish\w*)")
来获取匹配项。
然后你可以使用Series.fillna(method='ffill')
来填补空白的比赛
这一行应该足够了:
df['CopyDown'] = df.Firstname.str.extract('(\w+ish\w*)').fillna(method='ffill')
答案 1 :(得分:1)
这是一种方法。首先确定是否匹配。然后groupby
使用cumsum
技巧。最后,使用第一个值填充每个子组。
import pandas as pd
import re
# your data
# =============================
print(df)
Firstname Actual Age
0 Vishal 25
1 Nishant 33
2 Indira 58
3 Jagdish 58
4 Tamnna 30
# processing
# =============================
pattern = re.compile(r'\w+ish\w*')
df['matched'] = [(pattern.match(x) is not None) for x in df.Firstname.values]
df['diff_names'] = df.matched.astype(int).cumsum()
def func(group):
group['CopyDown'] = group['Firstname'].values[0]
return group.drop(['matched', 'diff_names'], axis=1)
df.groupby('diff_names').apply(func)
Firstname Actual Age CopyDown
0 Vishal 25 Vishal
1 Nishant 33 Nishant
2 Indira 58 Nishant
3 Jagdish 58 Jagdish
4 Tamnna 30 Jagdish