【问题标题】:Getting the avarage value from a column in a dataframe if a column contains a string specified in another dataframe如果列包含在另一个数据框中指定的字符串,则从数据框中的列获取平均值
【发布时间】:2020-08-04 17:49:06
【问题描述】:

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

我设法获得了特定单词的平均值,但是当我尝试循环遍历单词数据帧时,它花费了太多时间。

这适用于单个值:

prices.loc[prices['TEXT'].str.contains("PREMIUM", na=False)]['PRICE'].mean()

这是我尝试运行的循环:

for ind in words.index:
  words['avgs'][ind]=prices.loc[prices['TEXT'].str.contains(words['WORD'][ind], na=False)]['PRICE'].mean()

示例数据框:

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', ]})

有什么方法可以让这段代码更快? 谢谢!

【问题讨论】:

  • 在我看来,您需要做的就是 price['MeanForText']=prices.groupby('TEXT')['PRICE'].transform('mean') 并切片或选择每个文字单词?
  • 感谢您的回复,但是您如何检查价格数据框中的文本中是否包含该单词?
  • 是否可以添加小的示例数据框?
  • 取决于,发布数据框示例。有多种方法可以找出答案。
  • 我发布并编辑了示例,感谢您的帮助!

标签: python pandas dataframe


【解决方案1】:

最简单的方法是使用Series.str.extractall,然后使用join 提取回index,最后使用GroupBy.mean

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'].mean()
    .reset_index(name='MEAN_PRICE')
)

输出

print(final)
            WORDS  MEAN_PRICE
0            VINO    3.182500
1        ESPUMOSO    3.405000
2            ROSE    3.330000
3           GRADO    3.920000
4      ALCOHOLICO    3.920000
5            11.8    4.145000
6          ACIDEZ    3.260000
7         VOLATIL    4.145000
8            0.37    4.145000
9         COSECHA    3.330000
10           2013    3.330000
11             EN    3.512500
12          CAJAS    3.330000
13             DE    2.990000
14         06X750    4.145000
15             ML    3.405000
16            SIN    3.182500
17        EMBALAR    3.182500
18            CON    2.908333
19         ORIGEN    3.105000
20      SPARKLING    3.695000
21          ANGEL    3.695000
22           BRUT    3.105000
23           12.0    3.105000
24     06BOTELLAS    3.695000
25            750    2.861667
26     CHARDONNAY    2.375000
27          PINOT    2.445000
28           NOIR    2.445000
29          EXTRA    2.375000
30             BR    2.375000
31           UVA,    2.375000
32  GR.ALC.12.80,    2.375000
33           VOL.    2.375000
34           0.46    2.375000
35     G/L.,CAJAS    2.375000
36              6    2.445000
37      BOLTELLAS    2.375000
38             GA    2.515000
39             AV    2.515000
40           0.45    2.515000
41       BOTELLAS    2.515000

【讨论】:

  • 感谢您的回答。我想我没有正确解释自己,对不起。我遇到的麻烦与获取每个单词的平均价格有关。例如,如果您的示例的第一句和第二句中出现“orange”一词,则数据帧 WORD 将存储与“orange”一词关联的值 1500。
  • 所以您希望将平均值存储在 words 数据框中?
  • 没错!作为一种查明句子中某个词的出现是否与高于或低于平均价格相关的方法(例如,人们会期望在描述中包含“溢价”的某些产品的价格会高于一个没有)
  • 而且words数据框有可能在一个句子中存在多个单词?
  • 绝对,每个文本都会出现多个单词,因为 WORDS 数据框由 PRICES 数据框的 TEXT 列中的每个唯一单词组成
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-22
  • 2020-08-06
  • 2021-12-31
  • 2021-01-11
  • 2018-07-02
  • 2018-01-21
  • 2022-10-24
相关资源
最近更新 更多