Как найти среднее по числовому диапазону столбца в датафрейме python

Рейтинг: 0Ответов: 2Опубликовано: 26.07.2023

Есть следующий датафрейм, где в колонке Q29 - задан числовой диапазон, например, 10,000 - 15,000.
Нужно добавить колонку со средним значением от этих цифр.

Предполагаю, что надо разбить сплитом а дальше что, не получается корректно сделать. Помогите!

    Q23           Q29
4   Data Scientist  25,000-29,999
17  Data Scientist  200,000-249,999
18  Data Scientist  150,000-199,999
30  Data Scientist  50,000-59,999
33  Machine Learnin 125,000-149,999
... ... ...
23932   Data Scientist  1,000-1,999
23935   Data Scientist  30,000-39,999
23964   Data Scientist  1,000-1,999
23983   Machine Learnin 25,000-29,999
23990   Data Scientist  2,000-2,999

попробовала получить уникальные значения, получила массив:

array(['25,000-29,999', '200,000-249,999', '150,000-199,999',
       '50,000-59,999', '125,000-149,999', '5,000-7,499', '10,000-14,999',
       '30,000-39,999', nan, '$0-999', '4,000-4,999', '3,000-3,999',
       '80,000-89,999', '7,500-9,999', '100,000-124,999', '1,000-1,999',
       '15,000-19,999', '90,000-99,999', '40,000-49,999', '60,000-69,999',
       '>$1,000,000', '70,000-79,999', '2,000-2,999', '20,000-24,999',
       '300,000-499,999', '250,000-299,999', '$500,000-999,999'],
      dtype=object)

перевести в флоат так же не получается. Подскажите, логику действий, пожалуйста.

Ответы

▲ 0

Вам для начала нужно подготовить данные в датафрейме - там много мусора и есть значения, которые могут быть заведомо неверно интерпретированы при расчетах. Поэтому, сначала убираем nan, затем чистим, конвертируем и вычисляем. В общем случае можно сделать как-то так:

import pandas as pd
import numpy as np
a = ['25,000-29,999', '200,000-249,999', '150,000-199,999',
       '50,000-59,999', '125,000-149,999', '5,000-7,499', '10,000-14,999',
       '30,000-39,999', np.nan, '$0-999', '4,000-4,999', '3,000-3,999',
       '80,000-89,999', '7,500-9,999', '100,000-124,999', '1,000-1,999',
       '15,000-19,999', '90,000-99,999', '40,000-49,999', '60,000-69,999',
       '>$1,000,000', '70,000-79,999', '2,000-2,999', '20,000-24,999',
       '300,000-499,999', '250,000-299,999', '$500,000-999,999']
df = pd.DataFrame(a, columns=["Q29"])
df = df.dropna()
df["mean"] = df["Q29"].str.replace(r"[^0-9-]",'', regex=True).str.split("-").apply(lambda s: sum([float(x) for x in s])/len(s) if len(s)>1 else np.nan)
print(df)

получим:

                 Q29      mean
0      25,000-29,999   27499.5
1    200,000-249,999  224999.5
2    150,000-199,999  174999.5
3      50,000-59,999   54999.5
4    125,000-149,999  137499.5
5        5,000-7,499    6249.5
6      10,000-14,999   12499.5
7      30,000-39,999   34999.5
9             $0-999     499.5
10       4,000-4,999    4499.5
11       3,000-3,999    3499.5
12     80,000-89,999   84999.5
13       7,500-9,999    8749.5
14   100,000-124,999  112499.5
15       1,000-1,999    1499.5
16     15,000-19,999   17499.5
17     90,000-99,999   94999.5
18     40,000-49,999   44999.5
19     60,000-69,999   64999.5
20       >$1,000,000       NaN
21     70,000-79,999   74999.5
22       2,000-2,999    2499.5
23     20,000-24,999   22499.5
24   300,000-499,999  399999.5
25   250,000-299,999  274999.5
26  $500,000-999,999  749999.5

при этом всё равно остается неясность, как интерпретировать запятую. я вот решил, что она - разделитель разрядов, а не целой и дробной части.

▲ 0

Берем колонку 'Q29', удаляем в ней НаНы (не удаляя строк во фрейме), удаляем из строк нечисловые символы, затем разбиваем по дефису на 2 колонки, их преобразуем во float, далее находим среднее через метод mean(). Результат пишем в столбец "Среднее", который совмещается с фреймом по индексам. Таким образом, во фрейме остаются все строки, а там, где были НаНы в исходном столбце, остаются НаНы.

df = pd.DataFrame(['25,000-29,999', '200,000-249,999', '150,000-199,999',
                   '50,000-59,999', '125,000-149,999', '5,000-7,499', '10,000-14,999',
                   '30,000-39,999', None, '$0-999', '4,000-4,999', '3,000-3,999',
                   '80,000-89,999', '7,500-9,999', '100,000-124,999', '1,000-1,999',
                   '15,000-19,999', '90,000-99,999', '40,000-49,999', '60,000-69,999',
                   '>$1,000,000', '70,000-79,999', '2,000-2,999', '20,000-24,999',
                   '300,000-499,999', '250,000-299,999', '$500,000-999,999'], columns=['Q29'])
df['Среднее'] = df.Q29.dropna().str.replace('[^\d-]', '', regex=True).str.split('-', expand=True).astype(float).mean(axis=1)
print(df)
                 Q29    Среднее
0      25,000-29,999    27499.5
1    200,000-249,999   224999.5
2    150,000-199,999   174999.5
3      50,000-59,999    54999.5
4    125,000-149,999   137499.5
5        5,000-7,499     6249.5
6      10,000-14,999    12499.5
7      30,000-39,999    34999.5
8               None        NaN
9             $0-999      499.5
10       4,000-4,999     4499.5
11       3,000-3,999     3499.5
12     80,000-89,999    84999.5
13       7,500-9,999     8749.5
14   100,000-124,999   112499.5
15       1,000-1,999     1499.5
16     15,000-19,999    17499.5
17     90,000-99,999    94999.5
18     40,000-49,999    44999.5
19     60,000-69,999    64999.5
20       >$1,000,000  1000000.0
21     70,000-79,999    74999.5
22       2,000-2,999     2499.5
23     20,000-24,999    22499.5
24   300,000-499,999   399999.5
25   250,000-299,999   274999.5
26  $500,000-999,999   749999.5