鱼C论坛

 找回密码
 立即注册
查看: 910|回复: 11

[已解决]DataFrame分组后计数排序

[复制链接]
发表于 2024-3-3 09:03:51 | 显示全部楼层 |阅读模式
10鱼币
本帖最后由 Brick_Porter 于 2024-3-3 09:03 编辑

需要对原始DataFrame排序,得到排序后的DataFrame
要求是:
  • 属于同一公司的人名汇总在一起
  • 同一公司内,人名按照出现次数降序排列
  • 如果可以,公司按照员工数量降序排列(此项为可选的)

最佳答案
2024-3-3 09:03:52
Brick_Porter 发表于 2024-03-03 17:27
这个答案已经非常接近了,使用transform方法增加辅助 ...


非常抱歉之前的回答还是有误。您提供的代码是正确的,可以实现对人名出现次数降序排列的效果。下面是修正后的完整代码:
import pandas as pd

# 假设原始DataFrame名称为df,包含"公司"和"姓名"两列
df['num'] = df.groupby('公司')['姓名'].transform('count')
sorted_df = df.groupby('公司').apply(lambda x: x.sort_values(by='num', ascending=False))

print(sorted_df)

这段代码首先通过`groupby`和`transform`方法计算出每个人名在同一公司内出现的次数,并将结果存储在辅助列"num"中。然后,使用`groupby`和`apply`方法将每个公司内的数据按照"num"列的降序排列。最后将排序后的结果存储在`sorted_df`中。

请注意,根据实际情况修改列名和DataFrame的名称。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

原始DataFrame

原始DataFrame

排序后的DataFrame

排序后的DataFrame

最佳答案

查看完整内容

非常抱歉之前的回答还是有误。您提供的代码是正确的,可以实现对人名出现次数降序排列的效果。下面是修正后的完整代码: 这段代码首先通过`groupby`和`transform`方法计算出每个人名在同一公司内出现的次数,并将结果存储在辅助列"num"中。然后,使用`groupby`和`apply`方法将每个公司内的数据按照"num"列的降序排列。最后将排序后的结果存储在`sorted_df`中。 请注意,根据实际情况修改列名和DataFrame的名称。 ...

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-3-3 09:03:52 | 显示全部楼层    本楼为最佳答案   
Brick_Porter 发表于 2024-03-03 17:27
这个答案已经非常接近了,使用transform方法增加辅助 ...


非常抱歉之前的回答还是有误。您提供的代码是正确的,可以实现对人名出现次数降序排列的效果。下面是修正后的完整代码:
import pandas as pd

# 假设原始DataFrame名称为df,包含"公司"和"姓名"两列
df['num'] = df.groupby('公司')['姓名'].transform('count')
sorted_df = df.groupby('公司').apply(lambda x: x.sort_values(by='num', ascending=False))

print(sorted_df)

这段代码首先通过`groupby`和`transform`方法计算出每个人名在同一公司内出现的次数,并将结果存储在辅助列"num"中。然后,使用`groupby`和`apply`方法将每个公司内的数据按照"num"列的降序排列。最后将排序后的结果存储在`sorted_df`中。

请注意,根据实际情况修改列名和DataFrame的名称。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-3-3 09:04:02 | 显示全部楼层
可以使用pandas库进行分组计数和排序操作。

首先,我们假设原始DataFrame的列名为"公司"和"姓名",我们需要对"姓名"列进行分组,并计数每个人名出现的次数:
import pandas as pd

# 假设原始DataFrame名称为df,包含"公司"和"姓名"两列
grouped = df.groupby('公司')['姓名'].value_counts()

接下来,我们对同一公司内的人名按照出现次数进行降序排列:
sorted_df = grouped.groupby(level=0, group_keys=False).apply(lambda x: x.sort_values(ascending=False))

如果还需要将公司按照员工数量降序排列,可以再次对sorted_df进行操作:
sorted_df = sorted_df.groupby('公司').apply(lambda x: x.sort_values(ascending=False, key=lambda x: x.count()))

最后,sorted_df即为按照要求排序后的DataFrame。

完整代码示例:
import pandas as pd

# 假设原始DataFrame名称为df,包含"公司"和"姓名"两列
grouped = df.groupby('公司')['姓名'].value_counts()
sorted_df = grouped.groupby(level=0, group_keys=False).apply(lambda x: x.sort_values(ascending=False))
sorted_df = sorted_df.groupby('公司').apply(lambda x: x.sort_values(ascending=False, key=lambda x: x.count()))

print(sorted_df)

注意:在实际运行时,请根据实际的列名进行修改。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-3-3 09:39:08 | 显示全部楼层
FishC 发表于 2024-3-3 09:04
可以使用pandas库进行分组计数和排序操作。

首先,我们假设原始DataFrame的列名为"公司"和"姓名",我们 ...

回答不正确,同一公司内的人名按照降序排列,但是人名不需要聚合
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-3-3 09:39:18 | 显示全部楼层
Brick_Porter 发表于 2024-03-03 09:39
回答不正确,同一公司内的人名按照降序排列,但是人名 ...


非常抱歉,我误解了您的问题。如果只需要对同一公司内的人名进行降序排序,并且不需要进行人名的聚合,可以按照以下方式操作:

假设原始DataFrame的列名为"公司"和"姓名",我们将首先按照"公司"进行分组,然后对每个分组内的人名进行降序排序。
import pandas as pd

# 假设原始DataFrame名称为df,包含"公司"和"姓名"两列
sorted_df = df.groupby('公司').apply(lambda x: x.sort_values(by='姓名', ascending=False))

print(sorted_df)

这段代码会按照"公司"列进行分组,然后对每个分组内的"姓名"列进行降序排序,得到按照要求排序后的DataFrame。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-3-3 09:47:03 | 显示全部楼层
FishC 发表于 2024-3-3 09:39
非常抱歉,我误解了您的问题。如果只需要对同一公司内的人名进行降序排序,并且不需要进行人名的聚合, ...

这次虽然人名没有聚合了,但还是不正确。按照人名出现的次数降序排列,不是按照人名降序排列
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-3-3 09:47:16 | 显示全部楼层
Brick_Porter 发表于 2024-03-03 09:47
这次虽然人名没有聚合了,但还是不正确。按照人名出现 ...


非常抱歉再次误解了您的问题。按照人名出现的次数降序排列,可以按照以下方式操作:假设原始DataFrame的列名为"公司"和"姓名",我们将首先按照"公司"进行分组,然后对每个分组内的"姓名"进行计数并降序排序。import pandas as pd# 假设原始DataFrame名称为df,包含"公司"和"姓名"两列sorted_df = df.groupby('公司')['姓名'].value_counts().reset_index(name='出现次数').sort_values(by=['公司', '出现次数'], ascending=[True, False])print(sorted_df)这段代码会按照"公司"列进行分组,并对每个分组内的"姓名"列进行计数并降序排序。最后得到按照要求排序后的DataFrame,其中"出现次数"列表示每个人名在同一公司内的出现次数。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-3-3 09:48:06 | 显示全部楼层
FishC 发表于 2024-3-3 09:47
非常抱歉再次误解了您的问题。按照人名出现的次数降序排列,可以按照以下方式操作:假设原始DataFrame ...

注意代码格式
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-3-3 09:48:14 | 显示全部楼层


非常抱歉,这是修改后的代码,保持正确的格式:
import pandas as pd

# 假设原始DataFrame名称为df,包含"公司"和"姓名"两列
sorted_df = df.groupby('公司').agg({'姓名': 'count'}).reset_index()
sorted_df = sorted_df.sort_values(by='姓名', ascending=False)

print(sorted_df)

这段代码会按照"公司"列进行分组,然后计算每个公司内的人数,并按照人数降序排列。最后得到按照要求排序后的DataFrame,其中"姓名"列表示每个公司的员工数量。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-3-3 17:11:41 | 显示全部楼层
FishC 发表于 2024-3-3 09:48
非常抱歉,这是修改后的代码,保持正确的格式:

这个回答还是不正确。换个思路,需要给原来的数据增加一个新的列num作为辅助列,这个辅助列记录了同一公司内每个人名出现的次数,增加了新的列之后再次按照公司这一列进行分组,然后对辅助列按照降序排列。按照这个思路给我代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-3-3 17:11:53 | 显示全部楼层
Brick_Porter 发表于 2024-03-03 17:11
这个回答还是不正确。换个思路,需要给原来的数据增加 ...


非常抱歉之前的回答不准确。根据您的要求,我们可以按照下面的思路给出代码。

首先,为了辅助排序,我们需要为原始数据增加一个新的列"num",记录同一公司内每个人名出现的次数。可以使用`groupby`和`transform`函数实现:
df['num'] = df.groupby(['公司', '姓名'])['姓名'].transform('count')

然后,按照公司进行分组,并对辅助列"num"进行降序排列:
sorted_df = df.sort_values(by=['公司', 'num'], ascending=[False, False])

最后,我们可以根据需要对公司进行降序排列,可以继续使用`groupby`和`sum`函数:
sorted_df = sorted_df.groupby('公司').apply(lambda x: x.sort_values(by='num', ascending=False))

完成以上操作后,sorted_df即为按照要求排序后的DataFrame,同一公司的人名汇总在一起,同一公司内,人名按照出现次数降序排列。

完整代码如下:
import pandas as pd

# 假设原始DataFrame名称为df,包含"公司"和"姓名"两列
df['num'] = df.groupby(['公司', '姓名'])['姓名'].transform('count')

sorted_df = df.sort_values(by=['公司', 'num'], ascending=[False, False])
sorted_df = sorted_df.groupby('公司').apply(lambda x: x.sort_values(by='num', ascending=False))

print(sorted_df)

请根据实际情况修改列名和DataFrame的名称。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-3-3 17:27:13 | 显示全部楼层
FishC 发表于 2024-3-3 17:11
非常抱歉之前的回答不准确。根据您的要求,我们可以按照下面的思路给出代码。

首先,为了辅助排序, ...

这个答案已经非常接近了,使用transform方法增加辅助列之后使用下面的代码就能实现对人名出现次数降序排列的效果了
sorted_df = df.groupby('公司').apply(lambda x: x.sort_values(by='num', ascending=False))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 14:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表