我有一个大的数据帧(价格(,其中包含一个长描述和与该描述相关的价格。我生成了另一个数据帧(单词(,它保留了那些长描述中的所有唯一单词。我想做的是从价格数据帧中计算特定单词的价格总和,然后将其存储在单词数据帧中,与单词所在的行相同。
我得到了以下解决方案:
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', ]})
非常感谢!
自从我回答了你的最后一个问题后,我很容易发现这个问题。你得到更高总和的原因是,一个单词在一个句子中可以出现多次。所以在GroupBy
:之前使用DataFrame.drop_duplicates
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