【问题标题】:Filter dataframe rows which contribute to X% of values in one column过滤在一列中占 X% 值的数据框行
【发布时间】:2020-11-13 11:24:19
【问题描述】:

我有一个数据框:

df
Col1   Col2   Col3
A      B      5
C      D      4
E      F      1

我只想查看那些占 Col3 90% 的行。在这种情况下,预期的输出将是:

Col1   Col2   Col3
A      B      5
C      D      4

我尝试了以下方法,但没有按预期工作:

df['col3'].value_counts(normalize=True) * 100

是否有相同的解决方案?

【问题讨论】:

    标签: python pandas dataframe normalize


    【解决方案1】:

    你在找这个吗?

    df = df[df.Col3 > 0] # optionally remove 0 valued rows
    df = df.sort_values(by='Col3', ascending=False).reset_index(drop=True)
    totals = df.Col3.cumsum()
    cutoff = totals[totals >= df.Col3.sum() * .7].idxmin()
    print(df[:cutoff + 1])
    

    输出

      Col1 Col2  Col3
    0    A    B     5
    1    C    D     4
    

    【讨论】:

    • 我通过将 9 作为第一行中的值进行检查,然后是 0 和 1,当仅第一行满足条件时,它仍然显示 2 行。请您检查并发表评论吗?
    • 对不起,我拖了后腿。如果我将值设为 [6,3,1],那么贡献最大的应该是 [6,3],这是正确的并且符合我的期望。但是如果按顺序排列的值是 [6,1,3] 那么它显示 [6,1] 这是正确的,但不符合预期。我在创建数据框后尝试排序,但在这种情况下,我不知道为什么它显示所有 3 行。
    • @RSM 不用担心。请提供[6, 1, 3] 的预期答案并解释。
    • 谢谢,所以上述场景的期望是,我需要从数据集中找到对总价值的 70% 贡献最大的行。因此,如果值为 [6,3,1],则在值 [6,1] 和 [6,3] 之间,贡献最大的将是 [6,3] 因为 [6,3] 对总计超过 [6,1] (70%)。我希望我能够正确地解释它。
    【解决方案2】:

    @RSM,当您说 90% 的数据时,您是希望 90% 的计算始终从顶部开始,还是需要它是随机的?

       import pandas as pd
       import numpy as np
       from io import StringIO
    
       d = '''Col1   Col2   Col3
       A      B      5
       C      D      4
       E      F      1'''
    
       df = pd.read_csv(StringIO(d), sep='\s+')
    
       total_value = df['Col3'].sum()
       target_value = 0.9 * total_value
       df['Cumulative_Sum'] = df['Col3'].cumsum()
    
       desired_df = df.loc[df['Cumulative_Sum'] <=target_value]
       print(desired_df)
    

    【讨论】:

      猜你喜欢
      • 2017-11-12
      • 1970-01-01
      • 2021-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-12
      • 2012-08-17
      相关资源
      最近更新 更多