【问题标题】:Selecting the top 50 % percentage names from the columns of a pandas dataframe从 pandas 数据框的列中选择前 50% 的百分比名称
【发布时间】:2019-04-23 15:10:44
【问题描述】:

我有一个看起来像这样的熊猫数据框。行和列具有相同的名称。

name a  b  c  d  e  f  g 
 a   10 5  4  8  5  6  4
 b   5  10 6  5  4  3  3
 c   -  4  9  3  6  5  7
 d   6  9  8  6  6  8  2
 e   8  5  4  4  14 9  6
 f   3  3  -  4  5  14 7
 g   4  5  8  9  6  7  10

我可以通过传递 df['column_name'].nlargest(n=5) 来获得 5 个最大值,但是如果我必须按降序返回最大值的 50%,熊猫中是否有内置的我必须为它编写一个函数,我怎样才能得到它们?我对python很陌生。请帮帮我。

更新:所以让我们考虑 a 列,它有 10、5、-、6、8、3 和 4 之类的值。我必须将所有这些值加起来,得到前 50% 的值。所以在这种情况下,总数是 36。这些值的 50% 是 18。所以从 a 列中,我只想选择 10 和 8。同样,我想浏览所有其他列并选择 50%。

【问题讨论】:

    标签: python python-3.x pandas python-2.7


    【解决方案1】:

    排序很灵活:)

    df.sort_values('column_name',ascending=False).head(int(df.shape[0]*.5))
    

    更新: frac 参数仅适用于 .sample(),不适用于 .head 或 .tail。 df.sample(frac=.5) 确实给出了 50%,但 head 和 tail 只需要 int。 df.head(frac=.5) 失败,TypeError: head() got an unexpected keyword argument 'frac'

    注意:关于 int() 与 round()

    int(3.X) == 3 # True Where 0 >= X >=9 
    round(3.45) == 3 # True
    round(3.5) == 4 # True
    

    因此,在执行 .head(int/round ...) 时,请考虑适合您需要的行为。

    更新:要求

    所以让我们考虑 a 列,它的值类似于 10, 5,-,6,8,3 和 4。我必须把它们全部加起来,得到前 50% 他们。所以在这种情况下,总数是 36。这些值的 50% 将是 18. 所以从 a 列中,我只想选择 10 和 8。同样,我想浏览所有其他列并选择 50%。 -马特

    一个愚蠢的技巧是排序,找到累积总和,通过将其除以总和来找到中间,然后使用它来选择排序列的一部分。例如

    import pandas as pd
    
    data = pd.read_csv(
    pd.compat.StringIO("""name a b c d e f g 
    a 10 5 4 8 5 6 4
    b 5 10 6 5 4 3 3
    c - 4 9 3 6 5 7
    d 6 9 8 6 6 8 2
    e 8 5 4 4 14 9 6
    f 3 3 - 4 5 14 7
    g 4 5 8 9 6 7 10"""), 
    sep=' ', index_col='name'
    ).dropna(axis=1).apply(
    pd.to_numeric, errors='coerce', downcast='signed')
    
    x = data[['a']].sort_values(by='a',ascending=False)[(data[['a']].sort_values(by='a',ascending=False).cumsum()
                                                     /data[['a']].sort_values(by='a',ascending=False).sum())<=.5].dropna()
    print(x)
    

    结果:

    【讨论】:

    • 所以让我们考虑 a 列,它有 10、5、-、6、8、3 和 4 之类的值。我必须将所有这些值加起来,得到前 50% .所以在这种情况下,总数是 36。这些值的 50% 是 18。所以从 a 列中,我只想选择 10 和 8。同样,我想浏览所有其他列并选择 50%。请让我知道这是否有意义。
    • 现在这完全是一个不同的问题:) 我已经更新了我的答案
    【解决方案2】:

    您可以对数据框进行排序并仅显示 90% 的数据

    df.sort_values('column_name',ascending=False).head(round(0.9*len(df)))
    

    【讨论】:

    • 你 df.head(frac=0.9) 给了 90% 吗?我很少使用它,但它就在那里;)
    • 这不是真的。在阅读了 Pandas 文档和测试代码后,我将 sample 与 head 混淆了,.df.sample 将 frac 作为参数而不是 head/tail。因此,我 +1 你的答案。
    • 所以让我们考虑 a 列,它有 10、5、-、6、8、3 和 4 之类的值。我必须将它们全部加起来,得到前 50% .所以在这种情况下,总数是 36。这些值的 50% 是 18。所以从 a 列中,我只想选择 10 和 8。同样,我想浏览所有其他列并选择 50%。请让我知道这是否有意义。
    【解决方案3】:

    数据.csv

    name,a,b,c,d,e,f,g
    a,10,5,4,8,5,6,4
    b,5,10,6,5,4,3,3
    c,-,4,9,3,6,5,7
    d,6,9,8,6,6,8,2
    e,8,5,4,4,14,9,6
    f,3,3,-,4,5,14,7
    g,4,5,8,9,6,7,10
    

    test.py

    #!/bin/python
    
    import pandas as pd
    
    def percentageOfList(l, p):
        return l[0:int(len(l) * p)]
    
    df = pd.read_csv('data.csv')
    print(percentageOfList(df.sort_values('b', ascending=False)['b'], 0.9))
    

    【讨论】:

    • 所以让我们考虑 a 列,它有 10、5、-、6、8、3 和 4 之类的值。我必须将所有这些值加起来,得到前 50% .所以在这种情况下,总数是 36。这些值的 50% 是 18。所以从 a 列中,我只想选择 10 和 8。同样,我想浏览所有其他列并选择 50%。请让我知道这是否有意义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多