python - Pandas Groupby Head 按行数百分比
问题描述
我有一个数据框:
state city score
CA San Francisco 80
CA San Francisco 90
...
NC Raleigh 44
NY New York City 22
我想做一个 groupby.head(),但不是整数值,而是选择每个州-城市组合的前 80%,按 Score 排序。
因此,如果 CA, San Francisco 有 100 行,NC, Raleigh 有 20 行,则最终数据帧将包含 CA、San Francisco 的前 80 个分数行和 NC、Raleigh 的前 16 个分数行。
所以最终结果代码可能类似于:
df.sort_values('score', ascending=False).groupby(['State', 'City']).head(80%)
谢谢!
解决方案
from io import StringIO
import pandas as pd
# sample data
s = """state,city,score
CA,San Francisco,80
CA,San Francisco,90
CA,San Francisco,30
CA,San Francisco,10
CA,San Francisco,70
CA,San Francisco,60
CA,San Francisco,50
CA,San Francisco,40
NC,Raleigh,44
NC,Raleigh,54
NC,Raleigh,64
NC,Raleigh,14
NY,New York City,22
NY,New York City,12
NY,New York City,32
NY,New York City,42
NY,New York City,52"""
df = pd.read_csv(StringIO(s))
sample = .8 # 80%
# sort the values and create a groupby object
g = df.sort_values('score', ascending=False).groupby(['state', 'city'])
# use list comprehension to iterate over each group
# for each group, calculate what 80% is
# in other words, the length of each group multiplied by .8
# you then use int to round down to the whole number
new_df = pd.concat([data.head(int(len(data)*sample)) for _,data in g])
state city score
1 CA San Francisco 90
0 CA San Francisco 80
4 CA San Francisco 70
5 CA San Francisco 60
6 CA San Francisco 50
7 CA San Francisco 40
10 NC Raleigh 64
9 NC Raleigh 54
8 NC Raleigh 44
16 NY New York City 52
15 NY New York City 42
14 NY New York City 32
12 NY New York City 22
推荐阅读
- c++ - 在 C++ 中刷新字符串流时会发生什么?
- powerapps - 在共享点列表中使用搜索文本框 >500 个项目
- ansible - 如何编写一个可以在失败时运行任务的 ansible 处理程序?
- haskell - 为什么这个 Functor 实例不正确?
- go - 哈希字符串的有限并行
- javascript - Jquery处理多个变量的点击事件
- windows - Windows 中关键容器存储文件的 GUID 后缀是什么?
- python - Bokeh 和 Holoviews 网络可视化中 NetworkX 节点属性的颜色
- angular - 剑道角度用户界面向导
- java - 为什么数组中有额外的值?