我有一个下面的熊猫表(示意上):
现在我想对它进行排序...
...以这样的方式:
数据框按名称排序
具有相同名称和相似列表元素的行被分组在一起。“相似”是指两个相邻行应具有一个列表元素,其中这些行之间的列表元素之差在某个阈值之内(在这里我选择5)。
换句话说:对于任何两个相邻行,如果第一行中存在一个元素,而第二行中存在一个元素,使得差异在阈值之内,则应将它们分组在一起。
结果应如下所示:
编辑:我试过的:df.sort_values([['name'],ascending = False).groupby('List')
但这当然是行不通的,因为每个列表都是一个新的组,因为我不能引入“相似性”。
EDIT2:这是一个重现熊猫数据框的代码:
import pandas as pd
df = pd.DataFrame({
'List' : [[2,4],[3,5],[16,19],[4,1],[14,15],[300,20]],
'Name' : ["A","C","A","A","A","A"]})
我们需要在这里使用新的“ G”段,并使用 groupby
df['G']=df.L.apply(max)
df=df.sort_values(['Name','G'])
df['G']=df.groupby(['Name']).G.apply(lambda x : x.diff().fillna(0).gt(5).cumsum())
df.Name=df.Name+'_'+df.G.astype(str)
df
Out[1287]:
L Name G
0 [2, 4] A_0 0
3 [4, 1] A_0 0
4 [14, 15] A_1 1
2 [16, 19] A_1 1
5 [300, 20] A_2 2
1 [3, 5] C_0 0
数据输入
df=pd.DataFrame({'Name':list('ACAAAA'),'L':[[2,4],[3,5],[16,19],[4,1],[14,15],[300,20]]})
这是更新:
df['G']=df.L.apply(max)
df['G1']=df.L.apply(min)
df=df.sort_values(['Name','G'])
df['G']=df.groupby(['Name']).G.apply(lambda x : x.diff().fillna(0).gt(5))
df=df.sort_values(['Name','G1'])
df['G1']=df.groupby(['Name']).G1.apply(lambda x : x.diff().fillna(0).gt(5))
df.groupby('Name').apply(lambda x : ((x.G)|(x.G1)).cumsum())
df.Name=df.Name+'_'+df.groupby('Name').apply(lambda x : ((x.G)|(x.G1)).cumsum()).reset_index(level=0,drop=True).astype(str)
df
Out[1307]:
L Name G G1
3 [4, 1] A_0 False False
0 [2, 4] A_0 False False
4 [14, 15] A_1 True True
2 [16, 19] A_1 False False
5 [300, 20] A_2 True False
1 [3, 5] C_0 False False
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句