[英]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
,用( )
定义的单个捕获组然后是组1
、 2
等。
因此,您可以使用.group(0)
:
row['EntryStreetName'] = re.match('[^_]*', row['Path']).group(0)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.