Skip to main content
 首页 » 编程设计

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

2025年05月04日24grandyang

如何通过 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 

编辑,根据请求打印数据帧;

打印(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 

添加了打印输出

请您参考如下方法:

编辑:可能有更好的方法来做到这一点;我只是想我会提出这个建议。如果不符合要求,请告诉我,我会删除。

How to pass df10 and df20 (and even more dataframes) through func simultaneously and keep their names for further use?

如果您只想通过 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 包含每个新数据帧。并且您的原始数据帧 df10 df20 等保持不变。只需调用 A 的元素即可访问您的新数据帧。