有类似的命名问题,但它们并不能反映我所面临的用例。我有一个包含组和值的数据帧。我想选择按顺序划分的值(可能会混淆,示例会更好地解释(。
这是我的数据:
group value
a 20
a 16
a 14
a 13
a 12
b 19
b 17
b 16
b 14
b 13
b 12
b 12
b 11
我想按group
分组,并用最大逻辑切片[a:b],换句话说,如果a=2,b=7,则每组最大的第三、第四、第五、第六和第七个变量。我在这个用例中找不到任何问题,或者我可以在pandas-dev-github中找到一些东西吗。
如果任何组中的元素少于b
,则应应用b = len(of that group)
。如果有两个或多个元素具有相同的值,则如果它们在[a:b]切片内,则应全部选中。
我想要的结果是这样的:
group value
a 14
a 13
a 12
b 16
b 14
b 13
b 12
b 12
这里,组a
具有比示例中的b
少的5个元素,因此,返回第三到第五大元素。在组b
中,第6个和第7个最大值相同,因此它们都被返回。
最接近我的问题是关于切片的问题,但它没有使用最大逻辑。它只是将组分割开来。
如果你能指导我,我将不胜感激!
您可以尝试以下操作:
import pandas as pd
gbg = df.groupby('group')
a=2
b=7
res = gbg['value'].agg(lambda x: pd.Series.to_list(x)[a:b]).to_frame().explode('value').reset_index()
# .agg will "aggregate" the groups, here it will create the slices by group
# .to_frame will convert results from pd.Series to pd.DataFrame
# .explode() will write the list values in rows again
# .reset_index() will restore the column 'group'
.agg()
:后的中间结果
group
a [14, 13, 12]
b [16, 14, 13, 12, 12]
Name: value, dtype: object
完整的结果:
group value
0 a 14
1 a 13
2 a 12
3 b 16
4 b 14
5 b 13
6 b 12
7 b 12
通过首先对数据帧进行排序并使用slice
方法,这种方法给了我预期的结果。
df.sort_values(["group", "value"], ascending = False).groupby("group").slice(2, 7)
输出为
group value
a 14
a 13
a 12
b 16
b 14
b 13
b 12
b 12