【发布时间】:2020-05-04 14:07:27
【问题描述】:
很难在标题上描述这一点,但考虑到这两个 DataFrame:
import pandas as pd
import numpy as np
import re
df1 = pd.DataFrame({
'url': [
'http://google.com/car',
'http://google.com/moto',
'http://google.com/moto-bike'
], 'value': [3, 4, 6]})
url value
http://google.com/car 3
http://google.com/moto 4
http://google.com/moto-bike 6
df2 = pd.DataFrame({'name': ['car','moto','bus']})
name
0 car
1 moto
2 bus
我想看看df2 上的名字出现在url 上对于df1 的次数,并通过以下方式进行管理:
df2['instances'] = pd.Series([df1.url.str.contains(fr'\D{w}\D', regex=True) \
.sum() for w in df2.name.tolist()])
由于某种原因,汽车的实例为零,因为只有一个。
name instances
0 car 0
1 moto 2
2 bus 0
我希望能够有另一列将df1 的所有匹配项的value 列相加,所以它看起来像这样:
name instances value_total
0 car 1 3
1 moto 2 10
2 bus 0 0
任何有关正确方向的帮助将不胜感激,谢谢!
【问题讨论】:
-
所有的 url 是否都来自同一个域,或者至少是相同的格式?如果是这样,您可以在 url 列上使用正则表达式来删除您想要的部分,然后使用 pandas 内置插件在两个数据帧之间进行比较会很容易。
-
是的,相同的域但不一定相同的路径,我拥有的正则表达式似乎足以识别想要的行
-
为什么
\D在字前后都做?我理解正则表达式的含义,只是想知道 url 查找中的原因? -
我想删除可能出现在 url 上的
name值之前和之后的任何数字或字符,因此 \car 或 -car 匹配 car 但 carousel 或 motocar 不匹配 -
我认为如果这是你想要的,那么你需要一个重复限定符。 *(0个或更多)或? (0 或 1)取决于可能有多少特殊字符。