群体熊猫的群体化

时间:2017-12-26 16:43:59

标签: python python-3.x pandas

我有一个以下的pandas表(示意图):

enter image description here

现在我想对它进行排序......

......以这样一种方式:

  1. 数据框按名称排序

  2. 将具有相同名称和相似列表元素的行组合在一起。 “类似”我的意思是两个相邻的行应该有一个列表元素,其中这些行之间的列表元素的差异在一定的阈值内(这里我选择了5)。

  3. 换句话说: 对于任何两个相邻行,如果第一行中存在一个元素而第二行中存在一个元素,使得差异在阈值内,则应将它们组合在一起。

    1. 应重命名这些组。
    2. 结果如下:

      enter image description here

      修改 我尝试了什么: df.sort_values([ '名称'],升序=假).groupby( '列')

      但当然,这不起作用,因为每个列表都是一个新组,因为我不能引入“相似性”。

      EDIT2: 这是重现pandas数据帧的代码:

      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"]})
      

1 个答案:

答案 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