我有以下数据框,包含函数名称,参数,参数和参数类型的默认值:
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实现它?
答案 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)