Какой самый быстрый способ условно изменить значения фрейма данных в каждом индексе и столбце? - PullRequest
0 голосов
/ 31 декабря 2018

Есть ли способ уменьшить на постоянное число каждый элемент кадра данных, проверяя условие, включая их собственное значение, без использования цикла?

Например, каждая ячейка <2 видит, что ее значение уменьшается на 1.</p>

Большое спасибо.

Ответы [ 4 ]

0 голосов
/ 01 января 2019

В этом случае я бы использовал метод np.where из библиотеки NumPy.
В методе используется следующая логика:
np.where(<condition>, <value if true>, <value if false>)

Пример:

# import modules which are needed
import pandas as pd
import numpy as np

# create exmaple dataframe
df = pd.DataFrame({'A':[3,1,5,0.5,2,0.2]})

|  A  |
|-----|
|   3 |
|   1 |
|   5 |
| 0.5 |
|   2 |
| 0.2 |

# apply the np.where method with conditional statement
df['A'] = np.where(df.A < 2, df.A - 1, df.A)

|  A   |
|------|
|    3 |
|  0.0 |
|    5 |
| -0.5 |
|    2 |
| -0.8 |`
0 голосов
/ 31 декабря 2018

Я не уверен, что это самый быстрый, но вы можете использовать функцию .apply:

import pandas as pd
df = pd.DataFrame(data=np.array([[1,2,3], [2,2,2], [4,4,4]]), 
                  columns=['x', 'y', 'z'])

def conditional_add(x):
    if x > 2:
        return x + 2
    else:
        return x

df['x'] = df['x'].apply(conditional_add)

Добавит 2 в последнюю строку столбца x.

0 голосов
/ 31 декабря 2018

Больше похоже (данные Вилли)

df-((df<2)*2)
Out[727]: 
    x  y  z
0  -1  2  3
1   2  2  2
2   4  4  4
0 голосов
/ 31 декабря 2018

Мне нравится делать эту маскировку.Вот неэффективный цикл, использующий ваш пример

 #Example using loop
 for val in df['column']:
      if(val<2):
           val = val - 1

Следующий код дает тот же результат, но обычно он будет намного быстрее, потому что он не использует цикл.

 # Same effect using masks
 mask = (df['column'] < 2) #Find entries that are less than 2.
 df.loc[mask,'column'] = df.loc[mask,'column'] - 1 #Subtract 1.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...