2016-12-17 11 views
1

df10とdf20(そしてさらに多くのデータフレーム)を同時にfuncで渡し、後で使用するために名前を保持する方法はありますか?同時に複数のデータフレームを関数に渡す

import pandas as pd 
import numpy as np 

df = pd.DataFrame({ 
    'A': ['d','d','d','d','d','d','g','g','g','g','g','g','k','k','k','k','k','k'], 
    'B': [5,5,6,4,5,6,-6,7,7,6,-7,7,-8,7,-6,6,-7,50], 
    'C': [1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2], 
    'S': [2012,2013,2014,2015,2016,2012,2012,2014,2015,2016,2012,2013,2012,2013,2014,2015,2016,2014]  
    }); 

df10 = (df.B + df.C).groupby([df.A, df.S]).agg(['sum','size']).unstack(fill_value=0) 

df20 = (df['B'] - df['C']).groupby([df.A, df.S]).agg(['sum','size']).unstack(fill_value=0) 

def func(df): 
    df1 = df.groupby(level=0, axis=1).sum() 
    new_cols= list(zip(df1.columns.get_level_values(0),['total'] * len(df.columns))) 
    df1.columns = pd.MultiIndex.from_tuples(new_cols) 
    df2 = pd.concat([df1,df], axis=1).sort_index(axis=1).sort_index(axis=1, level=1) 
    df2.columns = ['_'.join((col[0], str(col[1]))) for col in df2.columns] 
    df2.columns = df2.columns.str.replace('sum_','') 
    df2.columns = df2.columns.str.replace('size_','T') 
    return df2 

EDIT、要求ごとにデータフレームが印刷されます。

プリント(DF10) プリント(DF20)は

df10: 

    sum size 
S 2012 2013 2014 2015 2016 2012 2013 2014 2015 2016 
A          
d 13 6 7 5 6 2 1 1 1 1 
g -11 8 8 8 7 2 1 1 1 1 
k -6 9 48 8 -5 1 1 2 1 1 



df20: 

    sum size 
S 2012 2013 2014 2015 2016 2012 2013 2014 2015 2016 
A          
d 9 4 5 3 4 2 1 1 1 1 
g -15 6 6 6 5 2 1 1 1 1 
k -10 5 40 4 -9 1 1 2 1 1 

プリントアウトが

+0

あなたのコードをdf10とdf20のように見えるサンプルで表示することはできますか? – Chuck

+0

関数を適用したいすべてのDataFramesのリストに対して 'for'ループを使うのが最も簡単だと思います。 'func'の後でこれらのDataFramesで何をしたいかによって異なります。 – josh

答えて

3

編集を追加しました:これを行うにはもっと良い方法はおそらくあります。私はちょうど私がこの提案を提供すると思った。必要でない場合はお知らせください。削除します。

funcでdf10とdf20(さらにはさらに多くのデータフレーム)を同時に渡し、後で使用するために名前を保持する方法はありますか?

funcで複数の機能を渡して、すべてのデータフレームが同じ形式であれば、次のようなことが有効です。簡単にするために

は、データフレームを取る:

df10 = pd.DataFrame({'one' : [1., 2., 3., 4.], 'two' : [4., 3., 2., 1.]}) 
df20 = pd.DataFrame({'one' : [1., 2., 3., 4.], 'two' : [4., 3., 2., 1.]}) 
df30 = pd.DataFrame({'one' : [1., 2., 3., 4.], 'two' : [4., 3., 2., 1.]}) 

とシンプルな機能:

your_func(df): 
    #### Perform some action/change to df eg 
    df2 = df.head(1) 
    return df2 

元のデータフレームのリストを作成します。

A = [df10,df20,df30] 

A = [ one two 
    0 1.0 4.0 
    1 2.0 3.0 
    2 3.0 2.0 
    3 4.0 1.0,  
     one two 
    0 1.0 4.0 
    1 2.0 3.0 
    2 3.0 2.0 
    3 4.0 1.0,  
     one two 
    0 1.0 4.0 
    1 2.0 3.0 
    2 3.0 2.0 
    3 4.0 1.0] 

を次に、forループを使用し例えば、リストを通して各データフレームを渡す。これにより、オリジナルのデータフレームは変更されません。

for i in range(0,len(A)): 
    A[i] = your_func(A[i]) 

出力:

A = [ 
one two 
0 1.0 4.0, 
one two 
0 1.0 4.0, 
one two 
0 1.0 4.0] 

だから、今リストAは、新たなデータフレームのそれぞれが含まれています。元のデータフレームdf10df20などは変更されません。新しいデータフレームにアクセスするには、Aの要素を呼び出すだけです。

+2

また、map: 'newA = map(your_funct、A)'またはリスト内包: 'newA = [あなたのiのiのための]' – Parfait

+0

@Parfait - あなたの方法ははるかにクリーンで効率的です。私はいつもマップについて忘れています。コメントありがとう:私も学んでいます。 – Chuck

+0

おかげで、私はdfを変更し、暖かい後に個別に電話する必要があります。 – Zanshin

関連する問題