Python 一次在数据帧中执行多个操作

Python 一次在数据帧中执行多个操作,python,pandas,dataframe,Python,Pandas,Dataframe,我正试图通过使用.groupby和pandasdataframe,使用以下数据,以一种智能的方式进行一些计算: import numpy as np import pandas as pd df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'], 'B' : ['one', 'one

我正试图通过使用
.groupby
pandas
dataframe
,使用以下数据,以一种智能的方式进行一些计算:

import numpy as np
import pandas as pd

df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar',
                              'foo', 'bar', 'foo', 'foo'],
                       'B' : ['one', 'one', 'two', 'three',
                              'two', 'two', 'one', 'three'],
                       'C' : np.random.randn(8),
                       'D' : np.random.randn(8)})
In [2]: df
Out[2]: 
     A      B         C         D
0  foo    one  0.469112 -0.861849
1  bar    one -0.282863 -2.104569
2  foo    two -1.509059 -0.494929
3  bar  three -1.135632  1.071804
4  foo    two  1.212112  0.721555
5  bar    two -0.173215 -0.706771
6  foo    one  0.119209 -1.039575
7  foo  three -1.044236  0.271860
我想以更短更快的方式计算以下输出:

 A    B          var1     var2      var3
bar  one      0.000000  0.000000  0.000000
     three    0.000000  0.000000  0.000000
     two      0.000000  0.000000  0.000000
foo  one      0.822999  19.705290 0.731207
     three    0.000000  0.000000  0.000000
     two      0.229541  5.509553  0.697971
目前,我知道如何以单独的方式进行:

# lambda functions to apply
diff = lambda x: max(x)-min(x)
per = lambda x: (max(x)-min(x))/max(x)
ratio1 = lambda x: (max(x)-min(x))/ len(x)

# grouping using col C
df.groupby(['A','B'])['C'].apply(diff)   # var1

#Grouping using col D
df.groupby(['A','B'])['D'].apply(per)    # var2
df.groupby(['A','B'])['D'].apply(ratio1) #var3
编辑: 我知道如何在一个数据帧中连接所有结果,但我想知道如何在一个数据帧中执行这3个操作。任何建议都会被接受,即使是由于性能低下而不在一个系统中执行所有操作…

您可以使用
agg()

要跳过重命名部分,可以调用函数
var1
var2
var3
,并在
groupby
中使用它

var1 = lambda x: max(x)-min(x)
var2 = lambda x: (max(x)-min(x))/max(x)
var3 = lambda x: (max(x)-min(x))/ len(x)
df.groupby(['A','B']).agg({'C': var1, 'D': [var2, var3]})
df.columns = df.columns.droplevel()
编辑

尝试:

def var1(x): return max(x)-min(x)
def var2(x): return (max(x)-min(x))/max(x)
def var3(x): return (max(x)-min(x))/ len(x)
编辑的编辑

这适用于我的
pandas
版本
0.19.2

import numpy as np
import pandas as pd

df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar',
                              'foo', 'bar', 'foo', 'foo'],
                       'B' : ['one', 'one', 'two', 'three',
                              'two', 'two', 'one', 'three'],
                       'C' : np.random.randn(8),
                       'D' : np.random.randn(8)})

def var1(x): return max(x)-min(x)
def var2(x): return (max(x)-min(x))/max(x)
def var3(x): return (max(x)-min(x))/ len(x)

df = df.groupby(['A','B']).agg({'C': var1, 'D': [var2, var3]})

df.columns = df.columns.droplevel()

@zipa不工作了。错误:函数名必须是唯一的,找到多个名为OK的函数,将
lambda
s更改为经典函数:)仅供参考,我会确定它,它仍然不工作。”索引“object”没有属性“droplevel”,您不能将groupby分配给变量
df
。请参见编辑。
import numpy as np
import pandas as pd

df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar',
                              'foo', 'bar', 'foo', 'foo'],
                       'B' : ['one', 'one', 'two', 'three',
                              'two', 'two', 'one', 'three'],
                       'C' : np.random.randn(8),
                       'D' : np.random.randn(8)})

def var1(x): return max(x)-min(x)
def var2(x): return (max(x)-min(x))/max(x)
def var3(x): return (max(x)-min(x))/ len(x)

df = df.groupby(['A','B']).agg({'C': var1, 'D': [var2, var3]})

df.columns = df.columns.droplevel()