Pandas: более эффективный способ проверки начала столбца и назначения нового столбца? - PullRequest
0 голосов
/ 26 февраля 2020

У меня есть фрейм данных с 500k строк следующим образом:

status_code
------------
202
302
403
500
202
.
.
.
------------

Я создал новый столбец как «status_code_grp», а затем проверяю каждую строку, начинается ли она с «2», я назначу « status_code_grp "=" 200 ". Повторите это для grp = "300", "400", "500".

Я написал что-то вроде этого:

df2 = pd.DataFrame(np.random.randint(200,599,size=(500000, 1)), columns=['status_code'])
for eachRow in range(len(df)):
    if(df['status_code'][eachRow].startswith['2']):
        df['status_code_grp'][eachRow] = "2xx" 
    elif(df['status_code'][eachRow].startswith['3']):
        df['status_code_grp'][eachRow] = "3xx" 
    elif(df['status_code'][eachRow].startswith['4']):
        df['status_code_grp'][eachRow] = "4xx" 
    elif(df['status_code'][eachRow].startswith['5']):
        df['status_code_grp'][eachRow] = "5xx" 

Для l oop очень долго время для завершения. Есть ли способ быть более эффективным, чем проверять строку за строкой с кодом выше?

1 Ответ

3 голосов
/ 26 февраля 2020

Делить на целочисленное деление на 100 и умножать на 100:

df2['status_code_grp'] = df2['status_code'] // 100  * 100

В numpy это быстрее, конвертировать серии в массив на Series.to_numpy:

df2 = pd.DataFrame(np.random.randint(200,599,size=(500000, 1)), columns=['status_code'])

In [381]: %timeit df2['status_code_grp1'] = df2['status_code'] // 100  * 100
12.5 ms ± 935 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [382]: %timeit df2['status_code_grp2'] = df2['status_code'].to_numpy() // 100  * 100
6.62 ms ± 42.6 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...