将数据帧拆分为两个并使用波浪号〜作为变量

Wil*_*uez 4 python tilde dataframe pandas

我想用Python 3中的Pandas做两个类似的操作.一个用波浪号,另一个没用波浪号.

1 - df = df[~(df.teste.isin(["Place"]))] 
2 - df = df[(df.teste.isin(["Place"]))]
Run Code Online (Sandbox Code Playgroud)

我试图将波浪号声明为变量,所以我只能写一行,然后决定是否要使用或不使用波浪号.但它不起作用:

tilde = ["~", ""]
df = df[tilde[0](df.teste.isin(["Place"]))]
Run Code Online (Sandbox Code Playgroud)

可以做一些可以减少我的代码的事情吗?因为我正在写很多相等的线只是交换波浪...

谢谢!

为什么我想把波浪号变为变量:

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)
Run Code Online (Sandbox Code Playgroud)

在每个函数的第二行中出现波形符.

jpp*_*jpp 6

对于您的有限用例,您要求的内容有限.

通过...分组

但是,您真正的问题是您必须创建的变量数量.您可以通过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}
Run Code Online (Sandbox Code Playgroud)

然后通过dfs[0]和访问您的数据帧dfs[1],从而False == 0True == 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)]
Run Code Online (Sandbox Code Playgroud)

序列拆包

如果您打算使用一行,请使用序列解包:

df1, df2 = (df[func(mask)] for func in tilde)
Run Code Online (Sandbox Code Playgroud)

请注意,您可以GroupBy通过以下方式复制结果:

dfs = dict(enumerate(df[func(mask)] for func in tilde)
Run Code Online (Sandbox Code Playgroud)

但这是冗长而复杂的.坚持GroupBy解决方案.