我有一个以下的pandas表(示意图):
现在我想对它进行排序......
......以这样一种方式:
数据框按名称排序
将具有相同名称和相似列表元素的行组合在一起。 “类似”我的意思是两个相邻的行应该有一个列表元素,其中这些行之间的列表元素的差异在一定的阈值内(这里我选择了5)。
换句话说: 对于任何两个相邻行,如果第一行中存在一个元素而第二行中存在一个元素,使得差异在阈值内,则应将它们组合在一起。
答案 0 :(得分:2)
我们需要新的' 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