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