使用复杂条件从现有的pandas数据框架形成数据框架

时间:2017-09-09 18:58:05

标签: python pandas

我有以下数据框,包含函数名称,参数,参数和参数类型的默认值:

FULL_NAME    ARGUMENT    DEF_VALS    TYPE
'function1'  'f1_arg1'   NAN         'NoneType'   
'function1'  'f1_arg2'   NAN          NAN
'function1'  'f1_arg3'   NAN          NAN
'function2'  'f2_arg1'   0            'int'
'function3'  'f3_arg1'   True         'bool'
'function3'  'f3_arg2'   'something'  'str'

该数据框可以如下复制:

import pandas as pd


D = {'FULL_NAME': ['function1', 'function1', 'function1', 'function2', 'function3', 'function3'], 'ARGUMENT': ['f1_arg1', 'f1_arg2', 'f1_arg3', 'f2_arg1', 'f3_arg1', 'f3_arg2'], 'DEF_VAL': [float('nan'), float('nan'), float('nan'), 0, True, 'something'], 'TYPE': ['NoneType', float('nan'), float('nan'), 'int', 'bool', 'str']}
dataframe = pd.DataFrame(D)

我试图获得的结果必须是这样的:

args                       function
[a1=NONE, a2=, a3=]        function1(f1_arg1=a1, f1_arg2=a2, f1_arg3=a3)
[a1=0]                     function2(f2_arg1=a1)
[a1=True, a2=something]    function3(f3_arg1=a1, f3_arg2=a2)

列' FULL_NAME'中的所有值和' ARGUMENT'是字符串。

关于{i},除非默认值为NAN且其类型为NAN,否则{i}应该等于参数默认值(在这种情况下,它应该后跟' ='签名)。如果参数的默认值为NAN但类型为NoneType,则{i}必须为None

这可以通过以下方式实现(建议使用解决方案here):

df['args'] = 'a'+(df.groupby('FULL_NAME').cumcount()+1).astype(str)

df['ARGUMENT'] = df['ARGUMENT']+ '=' + df['args']

df['args'] += '='

df['args'] = df.apply(lambda x: x['args']+'NONE' if x['TYPE'] == 'NoneType' else x['args'] 
                        if pd.isnull(x['TYPE']) else x['args']+str(x['DEF_VAL']),1   ) 

ndf = pd.concat([pd.DataFrame(df.groupby('FULL_NAME')['ARGUMENT'].apply(tuple)),
      pd.DataFrame(df.groupby('FULL_NAME')['args'].apply(list))],1)

ndf['function'] = (ndf.reset_index()['FULL_NAME'] + ndf.reset_index()['ARGUMENT'].apply(str)).tolist()

ndf = ndf.reset_index(drop=True).drop('ARGUMENT',1)

ndf['function'].replace(["'",",\)"],["",")"],regex=True,inplace=True)

但是,我想强加一个重要条件。 也就是说,其中一些函数实际上是类方法,初始数据框可能如下所示:

FULL_NAME    ARGUMENT    DEF_VAL      TYPE
'function1'  'self'      NAN          NAN
'function1'  'f1_arg2'   0            'int'
'function1'  'f1_arg3'   NAN          TypeNone
'function2'  'f2_arg1'   0            'int'
'function3'  'f3_arg1'   True         'bool'
'function3'  'f3_arg2'   'something'  'str'

在这种情况下,我希望“自我”。被忽略,结果框架如下所示:

args                       function
[a1=0, a2=None]            function1(f1_arg2=a1, f1_arg3=a2)
[a1=0]                     function2(f2_arg1=a1)
[a1=True, a2=something]    function3(f3_arg1=a1, f3_arg2=a2)

忽略self参数。如何使用pandas实现它?

1 个答案:

答案 0 :(得分:1)

您可以df = df[df['ARGUMENT'] != 'self'].copy(deep=True)删除ARGUMENT等于" self"的所有行在应用解决方案之前。

P.S。我也猜你只关心删除" self"如果它是第一个参数,那么在这种情况下,适当的预处理步骤将是

df = df[
    ~(
        (df['ARGUMENT'] == 'self') &
        (df.groupby('FULL_NAME').cumcount() == 0)
    )
].copy(deep=True)