【问题标题】:How to look for top values in a csv file per account name in python?如何在python中每个帐户名的csv文件中查找最高值?
【发布时间】:2012-10-03 15:54:03
【问题描述】:

无论如何我可以找到每个帐户名称和类型的 x1 或 x2 的前 2 个值吗?

我的文件如下所示:

   AccntName,Type,Value,x1,x2
   Accnt-01,A,0.001,85,1168
   Accnt-01,A,0.1814,65,664
   Accnt-01,A,11.1399,312,1861
   Accnt-01,A,12.228,55,305
   Accnt-01,A,13.3161,205,1095
   Accnt-01,B,15.0259,298,2139
   Accnt-01,B,17.9793,112,324
   Accnt-01,B,19.1451,2180,15194
   Accnt-02,A,20.3109,423,2947
   Accnt-02,A,13.3161,205,1095
   Accnt-02,A,15.0259,298,2139
   Accnt-02,A,19.0321,120,1323
   Accnt-02,B,20.3109,423,2947
   Accnt-02,B,13.3161,205,1095
   Accnt-02,B,15.0259,298,2139
   Accnt-02,B,19.0321,120,1323

输出如下内容:

Accnt-01,A,11.1399,312,1861 #top 2 values
Accnt-01,A,13.3161,205,1095 #for Accnt-01,A

Accnt-01,B,19.1451,2180,15194 #top 2 values
Accnt-01,B,15.0259,298,2139   #for Accnt-01,B

and so on.. for Accnt-02,A or B

任何建议都会很有帮助。非常感谢。

【问题讨论】:

  • 排名前两名的情况如何?您的预期输出实际上并未显示前两个...

标签: python sorting csv


【解决方案1】:

我不确定你所说的最后两个值是什么意思,所以我猜你的意思是这两个值的总和。使用csv 库将数据拉入行。现在,假设你有一个每个账户的列表,使用这个函数来拉出前两个:

process_list(l):
    p_l = sorted(l, key=lambda l: l[-1] + l[-2])
    return p_l.pop(), p_l.pop()

【讨论】:

    【解决方案2】:

    什么鬼,我今天很无聊......

    这确实复制了您请求的输出。使用 csv 模块会更“强大”,但亲爱的读者,我会把它留给你。

    csv=[line.strip() for line in """\
      AccntName,Type,Value,x1,x2
       Accnt-01,A,0.001,85,1168
       Accnt-01,A,0.1814,65,664
       Accnt-01,A,11.1399,312,1861
       Accnt-01,A,12.228,55,305
       Accnt-01,A,13.3161,205,1095
       Accnt-01,B,15.0259,298,2139
       Accnt-01,B,17.9793,112,324
       Accnt-01,B,19.1451,2180,15194
       Accnt-02,A,20.3109,423,2947
       Accnt-02,A,13.3161,205,1095
       Accnt-02,A,15.0259,298,2139
       Accnt-02,A,19.0321,120,1323
       Accnt-02,B,20.3109,423,2947
       Accnt-02,B,13.3161,205,1095
       Accnt-02,B,15.0259,298,2139
       Accnt-02,B,19.0321,120,1323
    """.splitlines()]
    
    maxes={}
    header=csv[0].split(',')
    for line in csv[1:]:
        eles=line.split(',')
        maxes.setdefault(eles[0]+', '+eles[1]+',',[]).append(
                tuple([float(eles[2]),int(eles[3]),int(eles[4])]))
    
    for key in maxes.keys():
        # Since you have a list of tuples, sort them to your choosing here
        maxes[key]=sorted(maxes[key],key=lambda t: t[2]+t[1], reverse=True)
    
    for key in sorted(maxes.keys()):
        print key,'{:8}, {:6}, {:6}'.format(*maxes[key][0])
        print key,'{:8}, {:6}, {:6}'.format(*maxes[key][1])
    

    输出:

    Accnt-01, A,  11.1399,    312,   1861
    Accnt-01, A,  13.3161,    205,   1095
    Accnt-01, B,  19.1451,   2180,  15194
    Accnt-01, B,  15.0259,    298,   2139
    Accnt-02, A,  20.3109,    423,   2947
    Accnt-02, A,  15.0259,    298,   2139
    Accnt-02, B,  20.3109,    423,   2947
    Accnt-02, B,  15.0259,    298,   2139
    

    【讨论】:

    • 也许使用 csv 模块会更健壮,但我无法解决我不断收到的 unhashble 类型等错误。这是一个很大的帮助,谢谢!
    • 说更多?您的示例只是字符串。 'unhashable type' 的错误意味着你有一个像列表一样的可变数据结构。只需将它们变成元组(如果没有看到上下文就有意义的话..)
    猜你喜欢
    • 1970-01-01
    • 2019-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-13
    • 1970-01-01
    相关资源
    最近更新 更多