用另一列的正则表达式替换一列中的 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 值。

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

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

但是 return 单元格中的内容如下:

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

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

直接用下划线拆分字符串不是更简单吗?

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,它 returns 是一个捕获组。在正则表达式中,整个匹配总是 0 组,然后用 ( ) 定义的单个捕获组是 12 等组

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

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