python - 如果列包含存储在另一个数据框中的字符串,则计算列的总和
问题描述
我有一个大数据框(价格),其中包含一个长描述和与该描述相关的价格。我生成了另一个数据框(单词),它保留了那些长描述所具有的所有唯一单词。我要做的是从价格数据框中计算特定单词的价格总和,然后将其存储在单词数据框中,与单词在同一行中。
我得到了以下解决方案:
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', ]})
非常感谢!
解决方案
自从我回答了你的最后一个问题,我很容易看到问题。您获得更高总和的原因是因为一个单词可以在一个句子中出现多次。所以DataFrame.drop_duplicates
在之前使用GroupBy
:
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
推荐阅读
- postgresql - 触发以阻止 UPDATE 并将其转换为 INSERT
- c# - 从 IQueryable 创建自定义对象而不将所有内容加载到内存中
- arrays - Natvis 可视化器将成员指针类型视为数组
- c# - Visual Studio C# 块在“输入”时无法正常格式化
- flutter - Flutter - 单选按钮不会显示保存在存储中的默认值(SharedPreferences)
- denodo - 将文件从一个文件夹移动到 Denodo 中的另一个文件夹
- user-interface - 是什么导致这两个验证规则错误消息之间的差异?
- c++ - QPrinter 打印与 Qt 不一致
- testing - 如何拥有一个 KotlinJS 模块,在其中使用 JUnit 测试业务逻辑?
- javascript - 使用nodejs检查哪个窗口或进程具有焦点