Разделение информационного кадра на два и использование тильды ~ в качестве переменной - PullRequest
0 голосов
/ 23 октября 2018

Я хочу сделать 2 аналогичные операции с пандами в Python 3. Одна с тильдой, а другая без тильды.

1 - df = df[~(df.teste.isin(["Place"]))] 
2 - df = df[(df.teste.isin(["Place"]))]

Я попытался объявить тильду как переменную, чтобы я мог написать только одну строку, а затемрешить, хочу ли я использовать с тильдой или без.Но это не работает:

tilde = ["~", ""]
df = df[tilde[0](df.teste.isin(["Place"]))]

Возможно ли сделать что-то, что может уменьшить мой код?Потому что я пишу много одинаковых строк, просто меняя тильду ...

Спасибо!

Почему я хочу тильду как переменную:

def server_latam(df):
    df.rename(columns={'Computer:OSI':'OSI'}, inplace=True) 
    df = df[~(df.teste.isin(["Place"]))]

    df1 = df.loc[df.model != 'Virtual Platform', 'model'].count()
    print("LATAM")
    print("Physical Servers: ",df1)
    df2 = df.loc[df.model == 'Virtual Platform', 'model'].count()
    print("Virtual Servers: ",df2)
    df3 = df.groupby('platformName').size().reset_index(name='by OS: ')
    print(df3)

def server_latam_without_tilde(df):
    df.rename(columns={'Computer:OSI':'OSI'}, inplace=True) 
    df = df[(df.teste.isin(["Place"]))]

    df1 = df.loc[df.model != 'Virtual Platform', 'model'].count()
    print("LATAM")
    print("Physical Servers: ",df1)
    df2 = df.loc[df.model == 'Virtual Platform', 'model'].count()
    print("Virtual Servers: ",df2)
    df3 = df.groupby('platformName').size().reset_index(name='by OS: ')
    print(df3)

Во второй строкекаждая функция появляется тильда.

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Вы могли бы немного сжать свой код, определив свои тесты, а затем повторив их.Позвольте мне проиллюстрировать:

tests = ["Place", "Foo", "Bar"]

for t in tests:
    # not sure what you are doing exactly, just copied it
    1 - df = df[~(df.teste.isin([t]))] 
    2 - df = df[(df.teste.isin([t]))]

Таким образом, у вас есть только две строки, выполняющие реальную работу, и простое добавление еще одного теста в список спасет вас от дублирования кода.Не знаю, если это то, что вы хотите.

0 голосов
/ 23 октября 2018

В вашем случае ограниченного использования то, что вы запрашиваете, имеет ограниченную выгоду.

GroupBy

Ваша проблема real , однако, это число переменных, которые выприходится создавать.Вы можете уменьшить их вдвое с помощью GroupBy и рассчитанного группировщика:

df = pd.DataFrame({'teste': ['Place', 'Null', 'Something', 'Place'],
                   'value': [1, 2, 3, 4]})

dfs = dict(tuple(df.groupby(df['teste'] == 'Place')))

{False:        teste  value
        1       Null      2
        2  Something      3,

 True:         teste  value
            0  Place      1
            3  Place      4}

Затем получить доступ к вашим фреймам данных с помощью dfs[0] и dfs[1], начиная с False == 0 и True == 1.В этом последнем примере является преимуществом.Теперь вы избавляетесь от необходимости создавать новые переменные без необходимости .Ваши кадры данных организованы, поскольку они существуют в одном словаре.

Функция диспетчеризации

Ваше точное требование может быть удовлетворено с помощью модуля operator и функции идентификации:

from operator import invert

tilde = [invert, lambda x: x]

mask = df.teste == 'Place'  # don't repeat mask calculations unnecessarily

df1 = df[tilde[0](mask)]
df2 = df[tilde[1](mask)]

Распаковка последовательности

Если вы хотите использовать одну строку, распакуйте последовательность:

df1, df2 = (df[func(mask)] for func in tilde)

Обратите внимание, что вы можете повторить результат GroupBy с помощью:

dfs = dict(enumerate(df[func(mask)] for func in tilde)

Но это многословно и запутанно.Придерживайтесь решения GroupBy.

...