同时通过一个函数传递多个数据帧

Zan*_*hin 1 python pandas

如何同时通过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
Run Code Online (Sandbox Code Playgroud)

根据要求编辑打印的数据框;

打印(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
Run Code Online (Sandbox Code Playgroud)

打印输出已添加

Chu*_*uck 5

编辑:可能有更好的方法来执行此操作;我以为我会提出这个建议。如果不是必需的,请告诉我,我将删除。

如何同时通过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.]})
Run Code Online (Sandbox Code Playgroud)

和一个简单的功能:

your_func(df):
    #### Perform some action/change to df eg
    df2 = df.head(1)
    return df2
Run Code Online (Sandbox Code Playgroud)

创建原始数据帧的列表:

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]
Run Code Online (Sandbox Code Playgroud)

然后,使用for循环使每个数据帧通过列表,例如,这将使原始数据帧保持不变。

for i in range(0,len(A)):
    A[i] = your_func(A[i])
Run Code Online (Sandbox Code Playgroud)

输出:

A = [
 one  two
0  1.0  4.0,
 one  two
0  1.0  4.0,
 one  two
0  1.0  4.0]
Run Code Online (Sandbox Code Playgroud)

因此,现在列表A包含每个新数据框。您的原始数据框df10 df20等保持不变。A只需调用的元素即可访问新的数据框。

  • 或者,使用map:`newA = map(your_funct,A)`或列表推导:`newA = [your_func(i)for i in A]` (3认同)