每个人过滤 2 个最高的唯一值
Filtering 2 highest unique values per person
我在我的项目中遇到了数据争论步骤,我想知道是否有人能够帮助我。
我的部分数据框是这样的:
人
月
GPI
1
12
10
1
12
12
1
11
18
1
10
20
2
10
12
2
8
14
2
9
16
但是,我按人分组,只保留 2 个最大的唯一月份值的行。因此,对于第 1 个人,这将是第 12 个月和第 11 个月,对于第 2 个人,这将是第 10 个月和第 9 个月。最终我想平均每个人的 GPI。
table 应该是这样的
人
月
GPI
avg_GPI
1
12
10
8
1
12
7
8
1
11
7
8
2
10
12
14
2
9
16
14
希望有人能帮我解决这个问题。
这是创建第一个 Table 的代码:
将 pandas 导入为 pd
df = pd.DataFrame({'Person':[1, 1, 1, 1, 2, 2, 2],
'month':[12, 12, 11, 10, 10, 8, 9],
'GPI':[10, 12, 18, 20, 12, 14, 16]})
提前致谢!
我们可以试试
s = df.groupby(['Person','month'])['GPI'].max().sort_values().groupby(level=[0]).tail(2)
out = df.loc[pd.MultiIndex.from_frame(df[['Person','month']]).isin(s.index)]
Out[66]:
Person month GPI
2 1 11 18
3 1 10 20
5 2 8 14
6 2 9 16
另一种方式:
df = df.groupby(['Person', 'month']).agg(list).sort_index(
ascending=False).groupby(level=0).head(2).explode('GPI')
输出:
Person month GPI
0 2 10 12
1 2 9 16
2 1 12 10
3 1 12 12
4 1 11 18
groupby
and rank
我们可以尝试 groupby
和 rank
到 select 行对应于每个 Person
的最大 2 个月值
df[df.groupby('Person')['month'].rank('dense', False) <= 2]
Person month GPI
0 1 12 10
1 1 12 12
2 1 11 18
4 2 10 12
6 2 9 16
我在我的项目中遇到了数据争论步骤,我想知道是否有人能够帮助我。
我的部分数据框是这样的:
人 | 月 | GPI |
---|---|---|
1 | 12 | 10 |
1 | 12 | 12 |
1 | 11 | 18 |
1 | 10 | 20 |
2 | 10 | 12 |
2 | 8 | 14 |
2 | 9 | 16 |
但是,我按人分组,只保留 2 个最大的唯一月份值的行。因此,对于第 1 个人,这将是第 12 个月和第 11 个月,对于第 2 个人,这将是第 10 个月和第 9 个月。最终我想平均每个人的 GPI。
table 应该是这样的
人 | 月 | GPI | avg_GPI |
---|---|---|---|
1 | 12 | 10 | 8 |
1 | 12 | 7 | 8 |
1 | 11 | 7 | 8 |
2 | 10 | 12 | 14 |
2 | 9 | 16 | 14 |
希望有人能帮我解决这个问题。
这是创建第一个 Table 的代码: 将 pandas 导入为 pd
df = pd.DataFrame({'Person':[1, 1, 1, 1, 2, 2, 2],
'month':[12, 12, 11, 10, 10, 8, 9],
'GPI':[10, 12, 18, 20, 12, 14, 16]})
提前致谢!
我们可以试试
s = df.groupby(['Person','month'])['GPI'].max().sort_values().groupby(level=[0]).tail(2)
out = df.loc[pd.MultiIndex.from_frame(df[['Person','month']]).isin(s.index)]
Out[66]:
Person month GPI
2 1 11 18
3 1 10 20
5 2 8 14
6 2 9 16
另一种方式:
df = df.groupby(['Person', 'month']).agg(list).sort_index(
ascending=False).groupby(level=0).head(2).explode('GPI')
输出:
Person month GPI
0 2 10 12
1 2 9 16
2 1 12 10
3 1 12 12
4 1 11 18
groupby
and rank
我们可以尝试 groupby
和 rank
到 select 行对应于每个 Person
df[df.groupby('Person')['month'].rank('dense', False) <= 2]
Person month GPI
0 1 12 10
1 1 12 12
2 1 11 18
4 2 10 12
6 2 9 16