Получение среднего значения из столбца в кадре данных, если столбец содержит строку, указанную в другом кадре данных - PullRequest
1 голос
/ 21 апреля 2020

У меня есть большой фрейм данных (цены), который содержит длинное описание и цену, связанную с этим описанием. Я сгенерировал другой фрейм данных (слова), в котором хранятся все уникальные слова, которые есть в этих длинных описаниях. То, что я пытаюсь сделать, это извлечь среднюю цену определенного слова из фрейма данных цен и затем сохранить его в фрейме слова, в той же строке, в которой находится слово.

Мне удалось получить среднее для конкретного слова, но когда я попытался перебрать слово dataframe, это заняло слишком много времени.

Это работает для одного значения:

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

И это L oop Я попытался запустить:

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 Ответ

1 голос
/ 22 апреля 2020

Проще всего было бы использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...