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

如果列包含在另一个数据帧中指定的字符串,则从数据帧中的列获取Average值

井学
2023-03-14

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

我设法获得了一个特定单词的平均值,但当我尝试在单词数据框中循环时,它花费了太多的时间。

这适用于单个值:

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

有没有办法让这段代码更快?谢谢

共有1个答案

楮景明
2023-03-14

最简单的方法是使用Series.str.extractall,然后将提取内容连接到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
 类似资料:
  • 我有一个大数据框(prices),它包含一个长描述和一个与该描述相关联的价格。我生成了另一个数据框(单词),它保存了那些长描述中的所有唯一单词。我要做的是从prices数据框计算一个特定单词的价格之和,然后将其存储在单词dataframe中,与单词所在的行相同。 我得到了以下解决方案: 但输出不适合求和(例如,列的总和为19.6,因此任何条件求和都不应高于此值,但它对“VINO”一词的计算结果为2

  • 用其他dataframe的列值替换dataframe的一列中的nan值时出现问题。下面是一个测试示例: 我想用其他dataframe中的特定值替换列名中的Nan值(如果其中有一些Nan值,则不是其他列),例如此dataframe中的Name2值: 我想得到的是: 这是此示例的测试代码: 然后我尝试了这三种方法,但都不起作用——我的数据帧始终保持Nan值。 你能告诉我哪里出错了吗?

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

  • 我在spark dataframe中有一个包含文本的列。 我想提取所有以特殊字符开头的单词,我正在使用从该文本列的每一行中提取。如果文本包含以开头的多个单词,则只返回第一个单词。 我正在寻找提取多个符合我在火花模式的单词。 样本输入:< code>@always_nidhi @YouTube不,我不明白,但我喜欢他们的音乐和舞蹈真棒这首mve的所有歌曲都很摇滚 示例输出:

  • 情况: 两个数据帧(df1和df2)具有相同的三个索引,例如“A”、“B”、“C”。df1和df2的列数不同。df1和df2中的所有单元格都填充了float类型的数据。 DF1: DF2: 目标: 从df2中选择的列(例如“BBB”)与df1的每列相加后,结果应存储在新的数据帧(df_new)中。df_new的格式应为df1(列数和行数),并具有与df1相同的列名和索引。 new_df: 我的做法

  • 我有两个数据帧df1和df2 df1如下 df2就像 我想根据df2中与df1中的列名匹配的单元格值将值从df1复制到df2,所以我的df3应该看起来像 df3 基本上,我想根据df2的单元格值(df1中的列名)从df1复制df2中的列 如果它仍然令人困惑,请告诉我