熊猫按最大切片分组



有类似的命名问题,但它们并不能反映我所面临的用例。我有一个包含组和值的数据帧。我想选择按顺序划分的值(可能会混淆,示例会更好地解释(。

这是我的数据:

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

最新更新