Более эффективный способ назначить группу для каждой строки в pandas - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть фрейм данных с более чем 1000 столбцами, и у меня есть предопределенный список групп. Я хотел бы сравнить каждое значение ячейки с каждой границей группы и создать новый столбец для назначения имени группы. Я написал for loops, но его обработка заняла более 5 минут. Есть ли более эффективный способ добиться этого? Спасибо

Вот мой фрейм данных

Frequency
21.0
18.0    
16.0    
10.0
10.0    
9.0    
10.0    
10.0      
5.0       
8.0 

И мой предопределенный список групп

> groups    
[(3, 5), (6, 10), (11, 30)]

Я бы хотел получить

Frequency   Group
21.0        11-30
18.0        11-30
16.0        11-30
10.0        6-10
10.0        6-10
9.0         6-10
10.0        6-10
10.0        6-10
5.0         3-5
8.0         6-10

Вот мой код

for i in range(0, len(fre_table["Frequency"])):
    for j in range(0, len(groups)):
        if fre_table["Frequency"][i] >= groups[j][0] and fre_table["Frequency"][i] <= groups[j][1]:
            break
    fre_table['Group'][i] = "{}-{}".format(groups[j][0], groups[j][1])

1 Ответ

0 голосов
/ 25 февраля 2020

Определение эффективности решения, предложенного @BallpointBen в разделе комментариев

Данные:

import numpy as np
import pandas as pd

fre_table = pd.DataFrame({'Index':[0,1,2,3,4,5,6,7,8,9],
             'Frequency':[21.0, 18.0, 16.0, 10.0, 10.0, 9.0, 10.0, 10.0, 5.0, 8.0]})
groups = [(3, 5), (6, 10), (11, 30)]

Время, затраченное на первоначальное решение: 0.5420

import timeit
start_time = timeit.default_timer()
fre_table['Group'] = 0
for i in range(0, len(fre_table["Frequency"])):
    for j in range(0, len(groups)):
        if fre_table["Frequency"][i] >= groups[j][0] and fre_table["Frequency"][i] <= groups[j][1]:
            break
    fre_table['Group'][i] = "{}-{}".format(groups[j][0], groups[j][1])
elapsed_time = timeit.default_timer() - start_time

Время, затраченное на окончательное решение: 0.0043s

import timeit
start_time = timeit.default_timer()
bins = pd.IntervalIndex.from_tuples(groups)
fre_table['Group'] = pd.cut(fre_table['Frequency'], bins)
elapsed_time = timeit.default_timer() - start_time

Примерно в 100 раз быстрее!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...