当前位置: 首页 > 知识库问答 >
问题:

如果列包含存储在另一个数据帧中的字符串,则计算该列的总和

章鸿光
2023-03-14

我有一个大数据框(prices),它包含一个长描述和一个与该描述相关联的价格。我生成了另一个数据框(单词),它保存了那些长描述中的所有唯一单词。我要做的是从prices数据框计算一个特定单词的价格之和,然后将其存储在单词dataframe中,与单词所在的行相同。

我得到了以下解决方案:

matches = (
    prices['TEXT'].str.extractall(f'({"|".join(words["WORD"])})')
    .rename(columns={0:'WORDS'})
    .rename_axis(['index', 'match'])
)

final = (
    prices.rename_axis('index')
    .join(matches)
    .groupby('WORDS', sort=False)['PRICE'].sum()
    .reset_index(name='SUM_PRICE')
)

但输出不适合求和(例如,列的总和为19.6,因此任何条件求和都不应高于此值,但它对“VINO”一词的计算结果为25.5):

    WORDS   MEAN_PRICE
0   VINO    25.5
1   ESPUMOSO    20.4
2   ROSE    13.3
3   GRADO   15.7
4   ALCOHOLICO  15.7

示例数据帧:


prices = pd.DataFrame({'TEXT': ['VINO ESPUMOSO ROSE GRADO ALCOHOLICO 11.8 ACIDEZ VOLATIL 0.37 COSECHA 2013 EN CAJAS DE 06X750 ML SIN EMBALAR', 'VINO CON DENOMINACION DE ORIGEN ESPUMOSO SPARKLING ANGEL BRUT GRADO ALCOHOLICO 12.0 06BOTELLAS EN ENVASE DE 750 ML SIN EMBALAR', 'VINO ESPUMOSO CHARDONNAY PINOT NOIR EXTRA BR DE UVA, GR.ALC.12.80, ACIDEZ  VOL. 0.46 G/L.,CAJAS DE 6 BOLTELLAS DE 750 ML. SIN EMBALAR', 'VINO PINOT NOIR ROSE BRUT GA 12.0 AV 0.45 COSECHA 2013 CON DENOMINACION DE ORIGEN EN CAJAS CON BOTELLAS DE 6X750CC SIN EMBALAR', 'VINO ESPUMOSO ROSE GRADO ALCOHOLICO 11.8 ACIDEZ VOLATIL 0.37 COSECHA 2013 EN CAJAS DE 06X750 ML SIN EMBALAR VINO CON DENOMINACION DE ORIGEN ESPUMOSO SPARKLING ANGEL BRUT GRADO ALCOHOLICO 12.0 06BOTELLAS EN ENVASE DE 750 ML SIN EMBALAR VINO ESPUMOSO CHARDONNAY PINOT NOIR EXTRA BR DE UVA, GR.ALC.12.80, ACIDEZ  VOL. 0.46 G/L.,CAJAS DE 6 BOLTELLAS DE 750 ML. SIN EMBALAR VINO PINOT NOIR ROSE BRUT GA 12.0 AV 0.45 COSECHA 2013 CON DENOMINACION DE ORIGEN EN CAJAS CON BOTELLAS DE 6X750CC SIN EMBALAR'],
                       'PRICE': [6.33, 5.43, 2.79, 3.07, 1.96]})

words = pd.DataFrame({'WORD':['VINO', 'ESPUMOSO', 'ROSE', 'GRADO', 'ALCOHOLICO', '11.8', 'ACIDEZ', 'VOLATIL', '0.37', 'COSECHA', '2013', 'EN', 'CAJAS', 'DE', '06X750', 'ML', 'SIN', 'EMBALAR', 'CON', 'DENOMINACION', 'ORIGEN', 'SPARKLING', 'ANGEL', 'BRUT', '12.0', '06BOTELLAS', 'ENVASE', '750', 'CHARDONNAY', 'PINOT', 'NOIR', 'EXTRA', 'BR', 'UVA,', 'GR.ALC.12.80,', 'VOL.', '0.46', 'G/L.,CAJAS', '6', 'BOLTELLAS', 'ML.', 'GA', 'AV', '0.45', 'BOTELLAS', '6X750CC', ]})

非常感谢!

共有1个答案

耿招
2023-03-14

自从我回答了你的最后一个问题,我很容易看出这个问题。你得到更高总和的原因是一个词在一个句子中可以出现多次。所以使用DataFrame。将重复项放在分组依据之前

matches = (
    prices['TEXT'].str.extractall(f'({"|".join(words["WORD"])})')
    .rename(columns={0:'WORDS'})
    .rename_axis(['index', 'match'])
)

final = (
    prices.rename_axis('index')
    .join(matches)
    .drop_duplicates()
    .groupby('WORDS', sort=False)['PRICE'].sum()
    .reset_index(name='SUM_PRICE')
)

            WORDS  SUM_PRICE
0            VINO      19.58
1        ESPUMOSO      16.51
2            ROSE      11.36
3           GRADO      13.72
4      ALCOHOLICO      13.72
5            11.8       8.29
6          ACIDEZ      11.08
7         VOLATIL       8.29
8            0.37       8.29
9         COSECHA      11.36
10           2013      11.36
11             EN      16.79
12          CAJAS      11.36
13             DE      19.58
14         06X750       8.29
15             ML      16.51
16            SIN      19.58
17        EMBALAR      19.58
18            CON      10.46
19         ORIGEN      10.46
20      SPARKLING       7.39
21          ANGEL       7.39
22           BRUT      10.46
23           12.0      10.46
24     06BOTELLAS       7.39
25            750      13.25
26     CHARDONNAY       4.75
27          PINOT       7.82
28           NOIR       7.82
29          EXTRA       4.75
30             BR       4.75
31           UVA,       4.75
32  GR.ALC.12.80,       4.75
33           VOL.       4.75
34           0.46       4.75
35     G/L.,CAJAS       4.75
36              6       7.82
37      BOLTELLAS       4.75
38             GA       5.03
39             AV       5.03
40           0.45       5.03
41       BOTELLAS       5.03
 类似资料:
  • 我有一个大数据框(prices),它包含一个长描述和一个与该描述相关联的价格。我生成了另一个数据框(单词),它保存了那些长描述中的所有唯一单词。我试图做的是从prices数据框中获取特定单词的平均价格,然后将其存储在单词dataframe中,与单词所在的行相同。 我设法获得了一个特定单词的平均值,但当我尝试在单词数据框中循环时,它花费了太多的时间。 这适用于单个值: 这是我尝试运行的循环: 示例数

  • 问题内容: 我正在使用java和iReport(来自jasper)创建一个简单的报告程序,应该以pdf格式创建报告,以显示PC的IP地址,位置,当前是否空闲(由其他系统处理),以及当前附加的项目列表(也在其他位置进行管理)。 我为此使用了iReport,并创建了一个虚拟集合生成类,如下所示: 在这种情况下,实体类为: 在Internet上进行了一些搜索之后,我找到了一种使用子报表执行类似 操作的方

  • 问题内容: 尝试通过一些非常有限的知识和经验来进行SQL查询。尝试了很多我通过搜索发现的内容,但没有得出我想要的结果。 我有四个表: 回复:KITS-[KIT_NO]和[ITEM_NO]都位于ITEMS表中。它们的串联是PK。 我想选择ORDERS,ORDERS.DATE,ORDER_DETAILS.ITEM_NO,ITEMS.DESC 没问题。一些简单的内部联接,我在路上。 困难在于在selec

  • 我有两个数据帧,如下所示- 我想检查在df1中的sym1是否存在于df2的sym2列中,如果存在,我想提取该行的名称,并将其添加到df1中作为新的列new_col。 为此,我尝试了下面的代码片段,它也在工作,但对于我的长数据帧,它不工作。我面临以下错误和警告消息- 代码片段- 如何从df2中获取这些名称列,并在df1中为特定行创建新的列?

  • 我试图在Spark Dataframe中创建一个列,如果列的行位于单独的Dataframe中,则为标志。 这是我的主Spark Dataframe() 这是我的引用(),这个引用中有数百行,所以我显然不能像这个解决方案或这个解决方案那样硬编码它们 我已经尝试了下面的代码,但我不明白图片中的错误是什么意思。

  • 问题内容: 在Java中,我想检查中是否存在字符串。 像这样: 问题是myList可以包含未修剪的数据: 如果我的项目在列表中,我希望它返回true 。我应该怎么做?我想避免循环结构。 问题答案: 您需要迭代列表并致电进行搜索: 或者,如果要执行 忽略大小写搜索 ,请使用: