将数据帧分为两部分,并使用代字号〜作为变量

时间:2018-10-23 10:54:31

标签: python pandas dataframe tilde

我想在Python 3中对Pandas进行2次类似的操作。 一个带波浪号,另一个不带波浪号。

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 :(得分:6)

对于有限的用例,所要求的收益有限。

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

序列拆包

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

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

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

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

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

答案 1 :(得分:0)

您可以通过定义测试然后遍历这些代码来稍微精简代码。让我举例说明:

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

这样,您只有两行代码可以完成实际工作,只需将另一个测试添加到列表中就可以节省代码。不知道这是否是您想要的。