【问题标题】:Subset pandas dataframe by values that are less than 80% of max value in each group. How?按每组中小于最大值 80% 的值对 pandas 数据帧进行子集。如何?
【发布时间】:2019-08-30 18:47:45
【问题描述】:

我有以下数据框:

d = {'group': ['a', 'b', 'c', 'b', 'b', 'c', 'a', 'b', 'a'],
'cum_sum': [1, 4, 3, 9, 15, 6, 3, 17, 4]}
df = pd.DataFrame(data=d)

我想过滤整个数据帧,只保留每组中 cum_sum 小于最大 cum_sum x 0.8 的记录。

我尝试使用 lambda 参数并对其进行过滤:

grouped = df.groupby('group')
grouped.filter(lambda x: x[x.cum_sum] <= x[x.cum_sum.max()])

但我根本不知道从哪里开始...有什么想法吗..?

根据评论更新!

【问题讨论】:

  • 请给我们样本数据,而不是其中的图像。
  • 抱歉,我更新了我的帖子

标签: python pandas filtering grouping subset


【解决方案1】:

你可以使用boolean indexing:

df1 = df[df['cum_sum'].lt(df.groupby('group')['cum_sum'].transform('max') * 0.8)]
print (df1)
  group  cum_sum
0     a        1
1     b        4
2     c        3
3     b        9
6     a        3

解释

首先使用GroupBy.transformmax 用于与原始DataFrame 相同大小的系列:

print (df.groupby('group')['cum_sum'].transform('max'))
0     4
1    17
2     6
3    17
4    17
5     6
6     4
7    17
8     4
Name: cum_sum, dtype: int64

乘以常数:

print (df.groupby('group')['cum_sum'].transform('max') * 0.8)
0     3.2
1    13.6
2     4.8
3    13.6
4    13.6
5     4.8
6     3.2
7    13.6
8     3.2
Name: cum_sum, dtype: float64

比较Series.lt&lt;

print (df['cum_sum'].lt(df.groupby('group')['cum_sum'].transform('max') * 0.8))
0     True
1     True
2     True
3     True
4    False
5    False
6     True
7    False
8    False
Name: cum_sum, dtype: bool

【讨论】:

    【解决方案2】:

    不是那么优雅的解决方案,但它确实有效。

    grouped = df.groupby('group').max()['cum_sum'].reset_index()
    grouped.columns=['group','max_cum_sum']
    df = df.merge(grouped)
    df = df.loc[df['cum_sum'] <= df['max_cum_sum']*0.8]
    

    【讨论】:

      猜你喜欢
      • 2014-03-23
      • 1970-01-01
      • 1970-01-01
      • 2020-05-21
      • 2015-06-05
      • 1970-01-01
      • 2018-10-22
      • 2020-04-20
      • 2020-12-06
      相关资源
      最近更新 更多