一度

2017-10-18 9 views
1

私は次のようなデータで、pandasdataframe.groupbyを使用してスマートな方法のいくつかの計算でやろうとしていますが、データフレーム内のいくつかの操作を行います。一度

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つの操作を1つの方法で実行する方法を知っています。

df.groupby(['A','B']).agg({'C': diff, 'D': [per, ratio1]}) 

あなたの機能var1var2var3を呼び出すことができます名前の変更部分をスキップするには、次のいずれかのアドバイスは、あなたがagg()を使用することができます...でも低いため、性能のひとつですべてを行うにしないように

答えて

2

を受け入れています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() 

EDIT

で試してみてください:EDIT

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) 

EDITこれは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() 
+0

@zipa。動作しません。エラー:関数名は一意である必要があり、古典的な機能に見られる複数の名前 PeCaDe

+0

さて、チェンジ 'lambda's :) – zipa

+0

FYIそれは[既知の問題](https://github.com/pandas-dev/pandas/issuesです/ 7186) – zipa