用另一列的正则表达式替换一列中的 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
组,然后用 ( )
定义的单个捕获组是 1
、2
等组
因此,您可以使用 .group(0)
:
row['EntryStreetName'] = re.match('[^_]*', row['Path']).group(0)
这是我正在处理的数据的一个小例子:
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
组,然后用 ( )
定义的单个捕获组是 1
、2
等组
因此,您可以使用 .group(0)
:
row['EntryStreetName'] = re.match('[^_]*', row['Path']).group(0)