【问题标题】:Supgrouping of Groups Pandas分组 Pandas
【发布时间】:2017-12-26 16:43:59
【问题描述】:

我有一个以下熊猫表(示意图):

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

...以这样的方式:

  1. Dataframe 按名称排序

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

换句话说: 对于任何相邻的两行,如果第一行存在一个元素,第二行存在一个元素,且差异在阈值之内,则应将它们分组在一起。

  1. 应该重命名这些组。

结果应该是这样的:

编辑: 我尝试了什么: df.sort_values(['name'],ascending=False).groupby('List')

当然,这是行不通的,因为每个列表都是一个新组,因为我无法引入“相似性”。

编辑2: 这是重现熊猫数据框的代码:

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

【问题讨论】:

  • 你试过group_by()
  • @DoHe 请看看我编辑的问题
  • 您愿意将此图片转换为可重现的代码示例吗?
  • 认为您应该详细说明 2。“相似”是指相邻的两个行应该有一个列表元素,其中这些行之间的列表元素的差异在一定的阈值内(这里我选择了 5)。
  • @coldspeed 完全没有,我加了。

标签: python python-3.x pandas


【解决方案1】:

我们在这里需要新的“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

【讨论】:

  • 哇,非常感谢!所以,你取每个列表元素的最大值......但是我不明白你是怎么做的。 “gt(5)”和“cumsum()”在做什么?你介意解释一下你的代码吗?
  • @totyped 首先我做了 diff,看看 value 的不同,如果大于 5,返回 True,这是你的 subgroup 的新开始,然后我们做 cumcum,你可以测试 True False True cumsum 将返回 1,1,2,这是您想要的,顺便说一句,如果您想要,您可以接受并投票 :-)
  • 如果我可以问的话,您对什么有不同的看法?
  • @totyped 与每个列表的最大值不同,看看它们是否应该属于一个组,如果差异小于5则应该是一个组
  • 有问题!我希望列表的两个值的差异应该小于 5,而不仅仅是最大值。例如:看看您的数据框,索引为 0 和 3:值 2 与下面的值 4 相差 2,值 4 与下面的“1”相差 3。你明白吗 ?我想只对 both 值在差异阈值内的那些进行分组,而不仅仅是最大值。我该怎么做??
猜你喜欢
  • 2021-07-13
  • 2015-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多