2017-09-09 12 views
1

これは私のデータフレームがどのように見えるかです:パンダのデータフレームからのデータに基づいて、テキストファイルにコンポジット出力を書く

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) 

書き込み条件はフォローイングですG:デフォルト値はNANであり、その種類はNAN(この場合、それは「=」記号が続くべきである)である場合を除き

{I}は引数のデフォルト値に等しくなければなりません。引き数のデフォルト値がNANで、タイプがNoneTypeの場合、a {i}はNoneでなければなりません。

'FULL_NAME'列と 'ARGUMENT'列の値はすべて文字列です。

また、すべてを非常に複雑にする条件が1つあります。引数の値が特別な値(special_value)に等しい場合、関数のシグネチャに含めるべきではありません。 たとえば、関数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'は無視されます。

パンダを使用してどのように出力することができますか?まったく可能ですか?

EDIT:もっと簡単に言えば

、このデータフレーム持つ:

:私はそれは次のようになりたいと思い

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'] 
+0

このような長い質問をお詫び申し上げます... – BigBear

+0

[最小限の、完全で検証可能な](https://stackoverflow.com/help/mcve)の例を提供した場合は役に立ちます。 SOコミュニティがどのように働くかではなく、あなたのために書かれたものが何かを説明しているようです。あなたの質問を編集して、試してみる必要がある特定の部分だけを含めるようにしてください。 –

+0

@AndrewL他の方法でこれをどのように記述するのか分かりません。私は私ができる限り短くて明確にしようとするときに、私が助けが必要なものを正確に記述しています。しかし、私はそれをより明確にするために編集します。 – BigBear

答えて

1

これは、いくつかの文字列操作、groupby cumcountおよび適用ビットie

で達成できます
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) 

はそれがお役に立てば幸いです。

+0

私はすごく感謝しています、ありがとうございました!答えだけでなく、適切にそれを行う方法に関するレッスン。私はそれを自分のコードに統合して、それが実際のデータとどのように機能するかを確認する必要があります。 「特殊条件」に関しては、今それをどう扱うかが明らかになっているようです。 – BigBear

+0

まだ2つの問題があります。最初の関数は、関数が引数を1つしか持たず、その署名が( 'f2_arg1 = a1'、)のようになっていますが、何とか(f2_arg1 = a1)することができます。つまり、コンマは最後に(タプルから来て)、引用符なしではありませんか? 2番目の問題は...おそらくそれは難しいかもしれませんが、特別な議論のケースを考慮に入れることは可能でしょうか? – BigBear

+0

特別な場合、私はこれを意味します:メソッドに 'self'引数がある場合、それは署名と{i}で無視されなければなりません、それにもかかわらず、私は2からではなく1から始めるべきです。簡単ではない... – BigBear

関連する問題