繁体   English   中英

用另一列中的正则表达式替换一列中的 NaN 值

[英]Replacing NaN values in one column with regex from another column

这是我正在使用的数据的一个小例子:

df = pd.DataFrame({'EntryStreetName': ['Palm Avenue', NaN, 'Peachtree Street'],
    'ExitStreetName': [NaN, 'Palm Avenue', 'Mitchell Street'],
    'Path': ['Palm Avenue_NW_Mitchell Street', 'Mitchell Street_SE_Palm Avenue', 'Peachtree Street_NE_Mitchell Street']})

我正在尝试提取Path的第一部分以替换EntryStreetName中的 NaN 值。

我设置了以下 function (这里是初学者):

def empty_streets(data):
    for index, row in data.iterrows():
        if row['EntryStreetName'] == np.nan:
            row['EntryStreetName'] = re.match('[^_]*', row['Path'])
    return data

但是,它在单元格中返回以下内容:

 <re.Match object; span=(0, 38), match='0      ...

有没有更简洁的方法可以返回一个字符串?

将字符串拆分为下划线不是更简单吗?

df['Path'].str.split('_', 1).str[0]

0         Palm Avenue
1     Mitchell Street
2    Peachtree Street
Name: Path, dtype: object

在此之后,使用fillna填充 NaN 的最后一步。

df['EntryStreetName'] = df['EntryStreetName'].fillna(
    df['Path'].str.split('_', 1).str[0]))
df

    EntryStreetName   ExitStreetName                                 Path
0       Palm Avenue              NaN       Palm Avenue_NW_Mitchell Street
1   Mitchell Street      Palm Avenue       Mitchell Street_SE_Palm Avenue
2  Peachtree Street  Mitchell Street  Peachtree Street_NE_Mitchell Street

你得到一个Match object 它具有您可以调用以获取所需部分的方法。

查看.group ,它返回一个捕获组。 在正则表达式中,整个匹配总是组0 ,用( )定义的单个捕获组然后是组12等。

因此,您可以使用.group(0)

row['EntryStreetName'] = re.match('[^_]*', row['Path']).group(0)

暂无
暂无

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

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