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

标签 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

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

打印(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 的元素即可访问您的新数据帧。

关于python - 同时通过一个函数传递多个数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41198150/

相关文章:

python - 识别录制声音中的音符 - 第 2 部分 - Python

python - 如何根据先前列表中的某些数字制作单独的列表?

Python从 Pandas 数据框中删除停用词

Python循环两个不同的数据帧来创建一个新列

python - Google Appengine Ndb GQL 查询最大限制是多少?

python - 根据颜色值将多维 Numpy 数组转换为二维数组

python - 无法将库导入项目

python - 对行进行排序并删除 NaN 值

python - 如何从列表中删除每个项目的方括号

python - ax.scatter() 语法无效?