Python 基于dataframe中的数据将复合输出写入文本文件

Python 基于dataframe中的数据将复合输出写入文本文件,python,pandas,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

以下是我的数据框的外观:

 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


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 = pandas.DataFrame(D)
使用此数据框,我需要以某种方式将以下信息写入文本文件:

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)
写作的条件如下:

{i}应该等于参数的默认值,除非默认值是
NAN
,并且其类型是
NAN
(在这种情况下,它后面应该跟“=”号)。如果参数的默认值为NAN,但类型为
NoneType
,则{i}必须为
None

“FULL_NAME”和“ARGUMENT”列中的所有值都是字符串

还有一个条件使一切变得非常复杂:如果其中一个参数的值等于某个特殊值(特殊_值),则不应将其包含在函数签名中。 例如,如果我们有函数g(W,r,dim,fix=False,r=0),其中“W”是特殊参数,那么应该为该函数写入文本文件的内容如下:

a1=
a2=
a3=False
a4=0
g(r=a1, dim=a2, fix=a3, r=a4)
其中“a1”对应“r”,“a2”对应“dim”等,而“W”被忽略

我如何通过使用熊猫来获得输出?有可能吗

编辑:

更简单地说,拥有此数据帧:

 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
考虑到上述条件,我想让它看起来像这样:

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

这可以通过一些字符串操作、groupby cumcount和应用位来实现

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)
输出:

args function 0 [a1=NONE, a2=, a3=] function1(f1_arg1=a1, f1_arg2=a2, f1_arg3=a3) 1 [a1=0] function2(f2_arg1=a1) 2 [a1=True, a2=something] function3(f3_arg1=a1, f3_arg2=a2) args函数 0[a1=NONE,a2=,a3=]函数1(f1_arg1=a1,f1_arg2=a2,f1_arg3=a3) 1[a1=0]功能2(f2_arg1=a1) 2[a1=True,a2=something]函数3(f3_arg1=a1,f3_arg2=a2)
希望能有帮助

很抱歉提出这么长的问题…如果您提供一个示例,将非常有帮助。你似乎在描述更多你需要写的东西,而不是SO社区的工作方式。请编辑您的问题,使其仅包括您在尝试后需要帮助的特定部分。@AndrewL我不知道如何以任何其他方式描述此问题。我正在准确地描述我需要的帮助,以使它尽可能简短和清晰。但我会对它进行编辑,让它更清晰。@AndrewL现在,数据框可以通过我在问题中编辑的词典进行复制。我非常感谢,非常感谢!不仅是为了答案,也是为了如何正确地做这件事的教训。我必须将它集成到我的代码中,看看它如何与实际数据一起工作。至于“特殊条件”,现在似乎很明显如何处理它。仍然有两个问题……第一个问题发生在函数只有一个参数时,它的签名看起来像这样('f2_arg1=a1',),但是否有可能以某种方式使它(f2_arg1=a1)。也就是说,结尾没有逗号(来自元组)也没有引号?第二个问题是…很可能很难,但是可以考虑特殊的参数情况吗?特殊情况的意思是:当一个方法有
self
参数时,它必须在签名和{I}中被忽略,也就是说,我应该从1开始,而不是从2开始。但这似乎不容易…我对这个特殊情况不太了解,但对于你的第一个问题,你可以使用正则表达式,因为它们都是字符串。希望它能帮上忙,这是怎么做的。非常感谢。但对于特殊情况,你的意思是你不知道如何处理,或者你不完全理解我的意思?我可以写更多…但是我好像已经问了你很多问题了…对不起。