Pandas Dataframe, упрощенный синтаксис для удаления строк в зависимости от значений - PullRequest
0 голосов
/ 13 ноября 2018

Рассмотрим Pandas Dataframe, например:

df = pd.DataFrame([[0,2],[1,0],[7,99]],index=[3,4,8], columns = ["R1","R2"])

Предоставление:

   R1  R2
3   0   2
4   1   0
8   7  99

Когда я хочу удалить строку с помощью условия для значения, которое я использую

df = df.drop(df[df["R1"] == 1].index)

Или

df = df.drop(df.index[np.where(df["R1"] == 1)[0]])

Или

df = df.drop(df.loc[df['R1'] == 1].index)

Оба супер громоздки.Вы знаете более простой синтаксис для достижения этой цели?

Например, если бы было что-то вроде функции idrop, второй вариант был бы более читабельным:

df = df.idrop(np.where(df["R1"] == 1)[0])

РЕДАКТИРОВАТЬ:

Я предполагал, что df = df[df['R1'] != 1] менее производительный, чем просто отбрасывание строки.(Огромная база данных ...)

1 Ответ

0 голосов
/ 13 ноября 2018

Нет, boolean indexing быстрее, чем drop, и, если необходимо улучшить производительность, используйте numepr:

enter image description here

import perfplot, numexpr

def bi1(df):
    return df[df['R1'].values != 1]

def bi2(df):
    return df[df['R1'] != 1]

def drop1(df):
    return df.drop(df[df["R1"] == 1].index)

def drop2(df):
    return df.drop(df.index[df["R1"] == 1])

def drop3(df):
    return df.drop(df.loc[df['R1'] == 1].index)

def drop4(df):
    return df.drop(np.where(df["R1"] == 1)[0])


def ne(x):
    x = x['R1'].values
    return x[numexpr.evaluate('(x != 1)')]

def q(x):
    return x.query('R1 != 1')

def ev(x):
    return x[x.eval('R1 != 1')]


def make_df(n):
    df = pd.DataFrame({'R1':np.random.randint(100, size=n)})
    return df

perfplot.show(
    setup=make_df,
    kernels=[bi1, bi2,drop1,drop2,drop3,drop4,ne,q,ev],
    n_range=[2**k for k in range(2, 25)],
    logx=True,
    logy=True,
    equality_check=False,
    xlabel='len(df)')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...