繁体   English   中英

根据针对正则表达式pandas检查的现有列填充新列

[英]Populate new column based on existing column checked against regex pandas

我在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特性,它可能在非规范化数据集中有用。 (使用日期作为东西)

提前致谢

您可以使用Series.str.extract("(\\w+ish\\w*)")来获取匹配项。

然后你可以使用Series.fillna(method='ffill')向前填充空的匹配

这条线应该足够了:

df['CopyDown'] = df.Firstname.str.extract('(\w+ish\w*)').fillna(method='ffill')

这是一种方法。 首先确定是否匹配。 然后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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM