Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 根据根据正则表达式检查的现有列填充新列_Python_Regex_Pandas - Fatal编程技术网

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

Python 根据根据正则表达式检查的现有列填充新列,python,regex,pandas,Python,Regex,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

我有一个熊猫数据框,如下所示

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


提前感谢

这里有一种方法。首先确定是否存在匹配项。然后使用
cumsum
技巧
groupby
。最后,使用第一个值填充每个子组

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

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

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

这一行应该足够了:

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

谢谢,这似乎很有魅力,当你使用提取物时,我有第一部分,但从来没有想到fillna方法。@VishalJethwa没问题。
fillna
方法充满了惊喜,而且做的事情远远不止一件。这使得完全理解变得很困难。你最终是采用了我的解决方案,还是采用了李建勋的解决方案?