找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 24562|回复: 20

[求助] 如何在DataFrame数据以一列为关键字分组,并选取所有组前N....

1

主题

15

帖子

15

积分

贫民

积分
15
xyzxz 发表于 2021-1-31 16:22:40 | 显示全部楼层 |阅读模式
2威望
紧急求助:将下表导入Pandas后,如何选取包含所有学校的、且以总分为序的、每所学校前N名学生记录,并生一个的DataFrame表,每个学校的人数N在表2中,具体问题先图,
      


回复

使用道具 举报

0

主题

956

帖子

956

积分

圣骑士

积分
956
sheeboard 发表于 2021-2-1 14:54:49 | 显示全部楼层
就是分组排序,传个文件吧,图也看不到。
回复

使用道具 举报

1

主题

15

帖子

15

积分

贫民

积分
15
xyzxz  楼主| 发表于 2021-2-1 17:01:59 | 显示全部楼层
本帖最后由 xyzxz 于 2021-2-1 17:11 编辑
sheeboard 发表于 2021-2-1 14:54[url=]Url[/url]
就是分组排序,传个文件吧,图也看不到。

确实是分组排序,只是我取分组的每组前X条记录,每组的X值不一样,保存另一表中。用head()行。请指教,多谢!

测试数据.xlsx

321.7 KB, 下载次数: 11

每个学校取的人数.xlsx

10.15 KB, 下载次数: 155

回复

使用道具 举报

0

主题

956

帖子

956

积分

圣骑士

积分
956
sheeboard 发表于 2021-2-1 18:45:41 | 显示全部楼层
本帖最后由 sheeboard 于 2021-2-1 19:00 编辑

参考
  1. import pandas as pd
  2. df1=pd.read_excel('测试数据.xlsx')
  3. df2=pd.read_excel('每个学校取的人数.xlsx')
  4. result=pd.DataFrame()

  5. for ind,data in df2.iterrows():
  6.     school_name=data['学校']
  7.     num=data['人数']
  8.     temp=df1[df1['学校']==school_name]
  9.     temp.sort_values('总分',ascending=False,inplace=True)
  10.     result.append(temp.head(num)ignore_index=True)

  11. result.to_excel('result.xlsx',index=False)
复制代码
Screenshot from 2021-02-01 18-59-31.png

点评

你好,先谢谢您对我的帮助,看你的运行结果挺好,我运行,这个链式赋值警告,不知道怎么处理,还请再帮着看看,多谢!  发表于 2021-2-3 15:29
我测试了一下,报了一个错误SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame,是不是版本的问题,查询得知这是一个链式问题,...  发表于 2021-2-3 10:06
这个思路,非常好,赞。多谢了,容我测试一下  发表于 2021-2-2 15:43
回复

使用道具 举报

1

主题

15

帖子

15

积分

贫民

积分
15
xyzxz  楼主| 发表于 2021-2-2 18:44:30 | 显示全部楼层
D:/mypython/wendang/ceshi.py:10: SettingWithCopyWarning:


对骑士,您好,我测试时发现有如下警告信息,查找百度,没有搞明白,请指点!,谢谢!!
A value is trying to be set on a copy of a slice from a DataFrame
See the caveats in the documentation: http://pandas.pydata.org/pandas- ... ng-view-versus-copy
  temp.sort_values('总分',ascending=False,inplace=True)
D:/mypython/wendang/ceshi.py:10: SettingWithCopyWarning:
回复

使用道具 举报

1

主题

15

帖子

15

积分

贫民

积分
15
xyzxz  楼主| 发表于 2021-2-2 18:53:22 | 显示全部楼层

圣骑士:你好,我按的代码进行测试,发现有如下警告信息,查百度后,仍不知如何处理,请指教,多谢了!
A value is trying to be set on a copy of a slice from a DataFrame
See the caveats in the documentation: http://pandas.pydata.org/pandas- ... ng-view-versus-copy
  temp.sort_values('总分',ascending=False,inplace=True)
回复

使用道具 举报

1

主题

15

帖子

15

积分

贫民

积分
15
xyzxz  楼主| 发表于 2021-2-3 16:59:11 | 显示全部楼层
走过的朋友,能解决上面警告问题,帮着看看怎么处理,多谢
回复

使用道具 举报

1

主题

15

帖子

15

积分

贫民

积分
15
xyzxz  楼主| 发表于 2021-2-3 17:50:23 | 显示全部楼层
本帖最后由 xyzxz 于 2021-2-3 17:53 编辑

temp1 = temp.sort_values('总分', ascending=False,  na_position='last') #inplace=True,我把上面这名改成这样,不报警告,生成的文件是空的,还是不明白??我用的是python3.5
回复

使用道具 举报

0

主题

956

帖子

956

积分

圣骑士

积分
956
sheeboard 发表于 2021-2-3 20:49:31 | 显示全部楼层
本帖最后由 sheeboard 于 2021-2-3 21:09 编辑

运行环境还是换主流一点的版本,去下个anaconda,方便一点。temp1 = temp.sort_values('总分', ascending=False,  na_position='last')这句前面改temp,警告忽略它,不要紧的。你可以去看警告给出的连接,里面会详细介绍为什么出警告,有的时候只是为了防止误操作,比如切片定位不适用多层索引,或改变源数据等。如果觉得不舒服用df.loc

点评

好的 ,我 再试试,多谢指点.  发表于 2021-2-3 21:44
回复

使用道具 举报

1

主题

15

帖子

15

积分

贫民

积分
15
xyzxz  楼主| 发表于 2021-2-4 16:37:38 | 显示全部楼层
sheeboard 发表于 2021-2-3 20:49
运行环境还是换主流一点的版本,去下个anaconda,方便一点。temp1 = temp.sort_values('总分', ascending=F ...

圣骑士,您好!我安装了Anaconda,安装了python3.8,结果和前面一样警告,生成空文件。换成df.loc,temp=df1.loc[df1['学校']==school_name]
,是这样吗?警告信息如下:
C:\ProgramData\Anaconda3\envs\python38\python.exe D:/mypython/wendang/ceshi.py
D:/mypython/wendang/ceshi.py:10: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: https://pandas.pydata.org/pandas ... -view-versus-a-copy
  temp.sort_values('总分',ascending=False,inplace=True)

Process finished with exit code 0
回复

使用道具 举报

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

本版积分规则

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