Python分析csv文件


=_=
2025-03-16 05:24:36 (27天前)
  1. 我正试图找到人口最多的三个人



</跨度>
零件(比亚迪)于1992年

我有一个看起来像这样的csv文件:http://data.kk.dk/dataset/9070067f-ab57-41cd-913e-bc37bfaf9acd/resource/9fbab4aa-1ee0-4d25 -b2b4-b7b63537d2ec / download / befkbhalderkoencivst.csv&gt ;

csv文件可以解释为:

AAR:哪一年进行了观察

比亚迪:哪个部分


</跨度>
,由contained中包含的整数描述

3 条回复
  1. 0# 至此 | 2019-08-31 10-32



    这实际上是一个非常好的迹象,你已经认识到必须有一个更简单的方法!每当你发现自己违反DRY原则(不要重复自己)时,你应该问你是否犯了一个失误。



    虽然你可以通过使用词典字典而不是所有那些命名变量来删除大量的复制,但是因为你正在使用熊猫,我会利用

    groupby



    nlargest

    相反,这给了我:




    1. In [47]: dg = df.groupby([“AAR”, BYDEL”], as_index=False)[“PERSONER”].sum()

    2. In [48]: dg[dg.AAR == 1992].nlargest(3, PERSONER”)
      Out[48]:
      AAR BYDEL PERSONER
      2 1992 3 67251
      1 1992 2 62221
      3 1992 4 47854

    3. </code>




    首先,我们对AAR和BYDEL列进行分组,并在每个组中,我们获取PERSONER值并对它们求和。这给了我们一个开始的框架




    1. n [51]: dg.head(15)
      Out[51]:
      AAR BYDEL PERSONER
      0 1992 1 40595
      1 1992 2 62221
      2 1992 3 67251
      3 1992 4 47854
      4 1992 5 43688
      5 1992 6 34303
      6 1992 7 36746
      7 1992 8 41668
      8 1992 9 45305
      9 1992 10 42748
      10 1992 99 2187
      11 1993 1 40925
      12 1993 2 62583
      13 1993 3 67783
      14 1993 4 47589

    2. </code>


    然后我们选择AAR == 1992的行,以及具有3个最大PERSONER值的行。



    ID

    非常

    建议通过阅读

    熊猫教程

    如果你要做这种类型的数据处理,否则你会发现自己重新发明轮子。


  2. 1# trpnest | 2019-08-31 10-32



    更加pythonic的解决方案将使用字典而不是许多(大多数)命名变量。你也在使用

    setdefault



    defaultdict

    实例 - 任何一个都是一个不错的选择,但使用两者都是不必要的。



    我的替代版本(不使用熊猫,因为@DSM很好地覆盖了):




    1. df = pd.read_csv(‘befkbh.csv’,quotechar=’”‘,skipinitialspace=True, delimiter=’,’, encoding=’latin1’).fillna(0)
      data = df.as_matrix()
      areas = { k : collections.defaultdict(list) for k in range(1,11) }
      areas[99] = collections.defaultdict(list)

    2. for row in data:
      key = row[0]
      if key == 1992 and row[1] in areas:
      areas[row[1]][key].append(0 if(row[5]) ==”” else float(row[5]))

    3. for area in sorted(areas):
      for k, v in areas[area].items():
      print (“{}:{}”.format(k, sum(v)))

    4. </code>


    我在假设

    row[2]

    在问题本来应该是

    row[1]

    ,因为比亚迪是第二列,而不是第三列。



    为了逐年获得前三名,我的组织方式略有不同,外部的词典是年份,而不是区域。



    那个版本看起来像这样:




    1. years = collections.defaultdict(lambda : collections.defaultdict(list))

    2. for row in data:
      years[row[0]][row[1]].append(0 if(row[5]) ==”” else float(row[5]))

    3. for year in sorted(years):
      for n, area in sorted((sum(v), k) for k, v in years[year].items())[:-4:-1]:
      print (“{} {:4} {:9}”.format(year, area, n))

    4. </code>

登录 后才能参与评论