鑑於這種數據幀:熊貓GROUPBY用Lambda和算法
import pandas as pd
import jenkspy
f = pd.DataFrame({'BreakGroup':['A','A','A','A','A','A','B','B','B','B','B'],
'Final':[1,2,3,4,5,6,10,20,30,40,50]})
BreakGroup Final
0 A 1
1 A 2
2 A 3
3 A 4
4 A 5
5 A 6
6 B 10
7 B 20
8 B 30
9 B 40
10 B 50
我想使用jenkspy標識該組,基於天然場所爲4組(類),每個值,其在「最後「屬於組內」BreakGroup「。
我開始做這個:
jenks=lambda x: jenkspy.jenks_breaks(f['Final'].tolist(),nb_class=4)
f['Group']=f.groupby(['BreakGroup'])['BreakGroup'].transform(jenks)
...這會導致:
BreakGroup
A [1.0, 10.0, 20.0, 30.0, 50.0]
B [1.0, 10.0, 20.0, 30.0, 50.0]
Name: BreakGroup, dtype: object
第一個問題在這裏,因爲你可能已經猜到,是它適用的拉姆達功能分配到「最終」分數的整列,而不僅僅是屬於Groupby中的每個組的分數。第二個問題是我需要一個指定正確的組(成員)成員的列,大概是通過使用transform而不是apply。
然後我嘗試這樣做:
jenks=lambda x: jenkspy.jenks_breaks(f['Final'].loc[f['BreakGroup']==x].tolist(),nb_class=4)
f['Group']=f.groupby(['BreakGroup'])['BreakGroup'].transform(jenks)
...卻又馬上打回就範:
ValueError: Can only compare identically-labeled Series objects
更新:
這裏是理想的結果。 「結果」列包含來自「最終」每個組「BreakGroup」的相應值的組的上限:
BreakGroup Final Result
0 A 1 2
1 A 2 3
2 A 3 4
3 A 4 4
4 A 5 6
5 A 6 6
6 B 10 20
7 B 20 30
8 B 30 40
9 B 40 50
10 B 50 50
在此先感謝!
f.sort_values('BreakGroup',inplace=True)
f.reset_index(drop=True,inplace=True)
jenks = lambda x: jenkspy.jenks_breaks(x['Final'].tolist(),nb_class=4)
g = f.set_index('BreakGroup')
g['Groups'] = f.groupby(['BreakGroup']).apply(jenks)
g.reset_index(inplace=True)
groups= lambda x: [gp for gp in x['Groups']]
#'final' value should be > lower and <= upper
upper = lambda x: [gp for gp in x['Groups'] if gp >= x['Final']][0] # or gp == max(x['Groups'])
lower= lambda x: [gp for gp in x['Groups'] if gp < x['Final'] or gp == min(x['Groups'])][-1]
GroupIndex= lambda x: [x['Groups'].index(gp) for gp in x['Groups'] if gp < x['Final'] or gp == min(x['Groups'])][-1]
f['Groups']=g.apply(groups, axis=1)
f['Upper'] = g.apply(upper, axis=1)
f['Lower'] = g.apply(lower, axis=1)
f['Group'] = g.apply(GroupIndex, axis=1)
f['Group']=f['Group']+1
這將返回:
我基於接受的解決方案略作修改應用
組邊界的列表
上邊界相關的該值「Final」
與「最終」值相關的下邊界
根據註釋中指出的邏輯,「最終」值所屬的組。
你能後的目標輸出? – EFT
當然可以;請參閱更新。 –