繁体   English   中英

如何将 dataframe 从第一行子集到列中的最大值?

[英]how to subset dataframe from first row to the highest value in a column?

我想根据具有累积值的列(“值”列)对 dataframe 进行子集化。
我的虚拟 dataframe 是:

index  x         y   g1 g2     value
0      24.25  50.65  a  1        25  
1      24.25  50.65  a  1        28
2      24.25  50.65  a  1       29
3      24.25  50.65  a  1       29
4      24.25  50.65  a  1       29
5      24.25  50.65  b  1       3
6      24.25  50.65  b  1       4
7      24.25  50.65  b  1       5
8      24.25  50.65  b  1       5

预期 output:

index  x         y   g1  g2     value
0      24.25  50.65  a  1        25  
1      24.25  50.65  a  1        28
2      24.25  50.65  a  1       29
3      24.25  50.65  b  1       3
4      24.25  50.65  b  1       4
5      24.25  50.65  b  1       5

我已经尝试过:

n=1
df_sub= df[df.groupby(['x','y','g1', 'g2']).apply(
                                lambda x: x.nlargest(n, 'value', keep='first')).reset_index(drop=True)

但它不会保留值低于最大值的行。 据我所知,如果将 n 更改为更高的值,您将获得第 n 个最高值,但关键是我不知道第一行和最高值之间的范围。 非常感谢任何帮助。 奥米德。

一种稍微不同的方法,过滤其中value是每组的最大值( groupby transform )或不重复( duplicated ):

max_m = (
    df.groupby(['x', 'y', 'g1', 'g2'])['value']
        .transform('max')
        .ne(df['value'])
)
dup_m = ~df['value'].duplicated()
filtered_df = df[max_m | dup_m]

filtered_df

       x      y g1  g2  value
0  24.25  50.65  a   1     25
1  24.25  50.65  a   1     28
2  24.25  50.65  a   1     29
5  24.25  50.65  b   1      3
6  24.25  50.65  b   1      4
7  24.25  50.65  b   1      5

这种方法的好处是它只会删除重复的最大值而不是其他重复,并且帧的顺序无关紧要:

df

       x      y g1  g2  value
0  24.25  50.65  a   1     25
1  24.25  50.65  a   1     29  # Max
2  24.25  50.65  a   1     25  # Duplicated but not Max
3  24.25  50.65  a   1     28
4  24.25  50.65  a   1     29  # Max (2)
5  24.25  50.65  b   1      3
6  24.25  50.65  b   1      4
7  24.25  50.65  b   1      5
8  24.25  50.65  b   1      5

filtered_df

       x      y g1  g2  value
0  24.25  50.65  a   1     25
1  24.25  50.65  a   1     29  # First Max is kept
2  24.25  50.65  a   1     25  # Duplicated but not Max (kept)
3  24.25  50.65  a   1     28
5  24.25  50.65  b   1      3
6  24.25  50.65  b   1      4
7  24.25  50.65  b   1      5

您是否正在寻找df.drop_duplicates()

使用subset ,您可以指定要操作的列,并keep要保留的行。

>>> df.drop_duplicates(subset=['value'], keep='first')
   index      x      y g1  g2  value
0      0  24.25  50.65  a   1     25
1      1  24.25  50.65  a   1     28
2      2  24.25  50.65  a   1     29
5      5  24.25  50.65  b   1      3
6      6  24.25  50.65  b   1      4
7      7  24.25  50.65  b   1      5

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM