在pandas中編寫要與groupby.apply或groupby.transform一起使用的函數(如果函數具有多個參數),那麼當將函數作爲groupby的一部分調用時,參數會使用逗號而不是在括號內。一個示例是:使用Groupby調用具有多個參數的函數
def Transfunc(df, arg1, arg2, arg2):
return something
GroupedData.transform(Transfunc, arg1, arg2, arg3)
其中df參數作爲第一個參數自動傳遞。
但是,使用函數對數據進行分組時似乎不可能使用相同的語法。看看下面的例子:
people = DataFrame(np.random.randn(5, 5), columns=['a', 'b', 'c', 'd', 'e'], index=['Joe', 'Steve', 'Wes', 'Jim', 'Travis'])
people.ix[2:3, ['b', 'c']] = NA
def MeanPosition(Ind, df, Column):
if df[Column][Ind] >= np.mean(df[Column]):
return 'Greater Group'
else:
return 'Lesser Group'
# This function compares each data point in column 'a' to the mean of column 'a' and return a group name based on whether it is greater than or less than the mean
people.groupby(lambda x: MeanPosition(x, people, 'a')).mean()
上述工作得很好,但我不明白爲什麼我必須包裝功能的拉姆達。基於所使用的語法轉換,並將其應用在我看來,以下應該只是罰款:
people.groupby(MeanPosition, people, 'a').mean()
誰能告訴我爲什麼,否則我怎麼可以調用函數沒有一個lambda包裝呢?
感謝
編輯:我不認爲這是可能的組通過傳遞一個功能鍵無包裝該功能在拉姆達的數據。一種可能的解決方法是不傳遞函數作爲鍵,而是傳遞一個由函數創建的數組。這將通過以下方式工作:
def MeanPositionList(df, Column):
return ['Greater Group' if df[Column][row] >= np.mean(df[Column]) else 'Lesser Group' for row in df.index]
Grouped = people.groupby(np.array(MeanPositionList(people, 'a')))
Grouped.mean()
但那麼當然它可能只是爲了更好地切出的中間人功能一起,簡單地使用與列表comprhension數組....
我認爲它的設計決策,就可以查詢來源看,如果可能的話(據我所知,它不是),並且如果可以在未來添加'** kwarg'給groupby –
令人沮喪!我的意思是用lambda包裝它很容易,但很難解釋爲什麼這應該是這種情況.... –