如何同时通过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)
打印输出已添加
编辑:可能有更好的方法来执行此操作;我以为我会提出这个建议。如果不是必需的,请告诉我,我将删除。
如何同时通过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只需调用的元素即可访问新的数据框。
| 归档时间: |
|
| 查看次数: |
2171 次 |
| 最近记录: |