Python 将数据帧一分为二并使用tilde~作为变量

Python 将数据帧一分为二并使用tilde~作为变量,python,pandas,dataframe,tilde,Python,Pandas,Dataframe,Tilde,我想在Python3中对Pandas执行两个类似的操作。 一个有瓷砖,另一个没有瓷砖 1 - df = df[~(df.teste.isin(["Place"]))] 2 - df = df[(df.teste.isin(["Place"]))] 我试图将tilde声明为变量,这样我就可以只写一行,然后决定是否使用tilde。但它不起作用: tilde = ["~", ""] df = df[tilde[0](df.teste.isin(["Place"]))] 是否可以做一些可以减少我的

我想在Python3中对Pandas执行两个类似的操作。 一个有瓷砖,另一个没有瓷砖

1 - df = df[~(df.teste.isin(["Place"]))] 
2 - df = df[(df.teste.isin(["Place"]))]
我试图将tilde声明为变量,这样我就可以只写一行,然后决定是否使用tilde。但它不起作用:

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)

在每个函数的第二行中,波浪线出现。

对于您有限的用例,您所请求的内容的好处有限

分组 然而,您真正的问题是必须创建的变量的数量。您可以通过
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
。最后一个例子有一个好处。现在,您不再需要创建不必要的新变量。您的数据帧是有组织的,因为它们存在于同一个字典中

功能调度 可通过
操作员
模块和身份识别功能满足您的精确要求:

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
解决方案。

您可以通过定义测试,然后迭代这些测试来压缩代码。让我举例说明:

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]))]

这样,实际工作中只有两行代码,只需向列表中添加另一个测试即可避免重复代码。但是,不知道这是否是您想要的。

可能的重复我看不出有什么好处:波浪号是一个字符,通常对应于一个字节。您希望将其存储在一个列表中,这意味着您至少需要三个键笔划和字节来索引它,再加上另一个XY键笔划/字节来引用变量。你到底想优化什么?打字?尺寸?“清洁”?可悲的是,这两种方法都无法实现。嗨,奥利弗,我编辑了我的问题。现在你可以明白我为什么要优化了。这似乎是一个XY问题。根本的问题是不必要地有很多变量名。我认为这是一个合理的问题。答案是使用
list
dict