2016-12-17 2 views
1

func를 통해 df10과 df20 (및 더 많은 데이터 프레임)을 동시에 전달하고 이름을 계속 사용하려면 어떻게해야합니까?함수를 통해 여러 데이터 프레임을 동시에 전달

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 

원래 dataframes의 목록 작성 : 단순 들어

가 dataframes 가지고 그런

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 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는 새로운 dataframes 각각 포함되어 있습니다. 원래 데이터 프레임 df10df20 등은 변경되지 않습니다. A 요소를 호출하여 새 데이터 프레임에 액세스하십시오.

+2

또는 map :'newA = map (your_funct, A)'또는 list comprehension을 사용하십시오 : – Parfait

+0

@Parfait - 당신의 방법은 훨씬 깔끔하고 효율적입니다. 나는 항상지도를 잊어 버린다. 댓글 주셔서 감사합니다 : 나는 너무 배우고 있어요. – Chuck

+0

감사합니다. 그러나 나는 df를 바꿔야하고 따끈 따끈하게 개별적으로 전화 할 수 있어야합니다. – Zanshin

관련 문제