python - 匹配多个数据帧之间的子字符串并在单独的列中求和加权值

标签 python python-3.x string pandas

我正在尝试根据它们是否包含来自另一个 DataFrame 的 1 个或多个子字符串来对名为 keywords 的字符串列表进行分类。

子字符串被加权,因此在末尾每个 keyword 都有大约 4 列的权重。这些列将称为 loanmortgageaccountscards

我尝试使用 join()concat()merge() 来连接多个数据帧,以及尝试使用 where()isin()contains()

我几次接近实现我的预期目标,但因错误或可扩展性而受阻。我对 Python 和 Pandas 的经验有限,因此可能有一种我没有考虑过的完全不同的方法。

import pandas as pd

df = pd.read_csv('Inputs/keyword.csv', header=0)
df['loan'] = 0
df2 = pd.read_csv('Essentials/Groups/loans.csv', header=0)

#review the data in df
print(df.head())

output:
           keywords  search_volume  loan
0             loans         132000     0
1    funding circle          81000     0
2        government          36000     0
3  short term loans          30000     0
4           company          27000     0

在上面的代码中,我加载了我的关键字列表,包括相关的搜索量。它目前没有贷款列,所以我添加了一个默认值设置为 0 的列。

下面,我有另一个 DataFrame,其中包含一个术语列表和一个关联的权重。我任意选择了一个整数 5,我想将其添加到现有总数中。

#review the data in df2
print(df2.head())

output:
      terms  weight
0      loan       5
1     loans       5
2  personal       3
3  business       3
4       apr       4

我发现了一个问题,但不知道如何解决。

我的列表包括loanloans。在我这边有这些副本对我来说很好。但是,第 3 行的值为“短期贷款”并标记为 False。

由于 loanloans 这两个词都出现在 short term loans 中,我希望它被标记为 True。我尝试反转 .isin() 语句,以便在 df['keywords'] 中搜索 df2['terms'] >,但结果是一样的。

#review the true/false for overlaps
print(df['keywords'].isin(df2['terms']).head())

output:
0     True
1    False
2    False
3    False
4    False

最后,一旦我们解决了这个 bool 问题,我就不知道如何根据匹配向量化 df['loan'] 中的总和变化。我试图避免 for 循环,因为我希望关键字列表包含大约 100,000 多行,并且每个类别 DataFrame 可能包含 1,000 个术语。

所需的输出看起来像这样:

output:
           keywords  search_volume  loan  mortgage  accounts  cards
0             loans         132000     10        0         0      0
1    funding circle          81000     0         0         0      0
2        government          36000     0         0         0      0
3  short term loans          30000     10        0         0      0
4           company          27000     0         0         0      0

最佳答案

df1 视为:

           keywords  search_volume
0             loans         132000
1    funding circle          81000
2        government          36000
3  short term loans          30000
4           company          27000

你可以求助series.str.extract()df.assign()我们可以这样做:

d=df2.set_index('terms')['weight']
pat=r'({})'.format('|'.join(df2.terms))
#'(loan|loans|personal|business|apr)'
df1=df1.assign(**{'term_match':df1.keywords.str.extract(pat,expand=False),
              'weight':df1.keywords.str.extract(pat,expand=False).map(d)})
print(df1)

输出

           keywords  search_volume term_match  weight
0             loans         132000       loan     5.0
1    funding circle          81000        NaN     NaN
2        government          36000        NaN     NaN
3  short term loans          30000       loan     5.0
4           company          27000        NaN     NaN

编辑 要找到所有匹配的字符串,让我们将 df2 更新为:df2.loc[5]=['term',3] 仅用于测试。

然后使用 series.str.findall() :

s=df1.keywords.str.findall(pat)
df1=df1.assign(**{'term_match':s.apply(','.join),
              'weight':s.apply(lambda x: sum([d.get(item,item)  for item in x]))})
print(df1)

           keywords  search_volume  loan term_match  weight
0             loans         132000     0       loan       5
1    funding circle          81000     0                  0
2        government          36000     0                  0
3  short term loans          30000     0  term,loan       8
4           company          27000     0                  0

关于python - 匹配多个数据帧之间的子字符串并在单独的列中求和加权值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56313103/

相关文章:

python - Python中隐式曲线的高阶局部插值

Python:如何从sqlite数据库查询utf-8字符串

python - 将 Twitter API 与 Python 结合使用(地理编码)

python - 嵌套字典的列表理解

c++ - 如何比较字符串数组中的单词?

python - 在 C++ 中嵌入 Cython

python - 使用Python和SQLite创建表,没有这样的表

python-3.x - ruamel yaml 为转储禁用别名

Java String 在此片段中创建了多少个对象

c - C 中“”的不同行为