【问题标题】:Querying csv files in python like sql像sql一样在python中查询csv文件
【发布时间】:2020-10-10 07:15:16
【问题描述】:

这显然是一个流行的面试问题。
有 2 个包含恐龙数据的 CSV 文件。我们需要查询它们以返回满足特定条件的恐龙。

注意 - 我们不能使用其他模块,如 q、fsql、csvkit 等。

file1.csv:

NAME,LEG_LENGTH,DIET
Hadrosaurus,1.2,herbivore
Struthiomimus,0.92,omnivore
Velociraptor,1.0,carnivore
Triceratops,0.87,herbivore
Euoplocephalus,1.6,herbivore
Stegosaurus,1.40,herbivore
Tyrannosaurus Rex,2.5,carnivore

file2.csv

NAME,STRIDE_LENGTH,STANCE
Euoplocephalus,1.87,quadrupedal
Stegosaurus,1.90,quadrupedal
Tyrannosaurus Rex,5.76,bipedal
Hadrosaurus,1.4,bipedal
Deinonychus,1.21,bipedal
Struthiomimus,1.34,bipedal
Velociraptor,2.72,bipedal

使用论坛: 速度 = ((STRIDE_LENGTH / LEG_LENGTH) - 1) * SQRT(LEG_LENGTH * g),其中 g = 9.8 m/s^2

编写一个程序来读取 csv 文件,并仅打印双足恐龙的名称,按速度从快到慢排序。

在 SQL 中,这很简单:

select f2.name from
file1 f1 join file2 f2 on f1.name = f2.name
where f1.stance = 'bipedal'
order by (f2.stride_length/f1.leg_length - 1)*pow(f1.leg_length*9.8,0.5) desc

这在 python 中如何实现?

【问题讨论】:

  • 你有什么想法?我不认为知道我们中的一个人能通过面试是你真正想要的。
  • @IgorRivin,我知道用sql怎么做,想知道怎么用python解决
  • 你可以使用熊猫吗?
  • 您需要编写完成所有这些事情的代码。这对于 StackOverflow 来说太宽泛了
  • @juanpa.arrivillaga,不要求提供成熟的部署就绪代码,即使是关于从哪里开始的指针或想法也将不胜感激

标签: python sql csv


【解决方案1】:

我在工作中遇到了同样的问题,因此决定构建一个离线桌面应用程序,您可以在其中加载 CSV 并开始编写 SQL。您可以加入、分组等。

这由 C 和 SQLite 支持,可以在大约 10 秒内处理 GB 的 CSV 文件。速度非常快。

这是应用程序:https://superintendent.app/

虽然这不是 Python,但使用起来更方便。

【讨论】:

    【解决方案2】:
    def csvtable(file):     # Read CSV file into 2-D dictionary
        table = {}
        f = open(file)
        columns = f.readline().strip().split(',')       # Get column names
        
        for line in f.readlines():
            values = line.strip().split(',')            # Get current row
            for column,value in zip(columns,values):
                if column == 'NAME':                    # table['TREX'] = {}
                    key = value
                    table[key] = {}
                else:
                    table[key][column] = value          # table['TREX']['LENGTH'] = 10
        
        f.close()
        return table
    
    
    # READ
    try:
        table1 = csvtable('csv1.txt')
        table2 = csvtable('csv2.txt')
    except Exception as e:
        print (e)
    
    
    # JOIN, FILTER & COMPUTE
    table3 = {}
    for value in table1.keys():
        if value in table2.keys() and table2[value]['STANCE'] == 'bipedal':             # Join both tables on key (NAME) and filter (STANCE)
    
            leg_length = float(table1[value]['LEG_LENGTH'])
            stride_length = float(table2[value]['STRIDE_LENGTH'])
            speed = ((stride_length / leg_length) - 1) * pow((leg_length * 9.8),0.5)    # Compute SPEED
    
            table3[value] = speed
    
    
    # SORT
    result = sorted(table3, key=lambda x:table3[x], reverse=True)                       # Sort descending by value
    
    # WRITE
    try:
        f = open('result.txt', 'w')
        for r in result:
            f.write('%s\n' % r)
        f.close()
    except Exception as e:
        print (e)
    

    【讨论】:

      【解决方案3】:

      你可以在熊猫中做到这一点,

      import pandas as pd
      df_1 = pd.read_csv('df_1.csv')
      df_2 = pd.read_csv('df_2.csv')
      
      df_comb = df_1.join(df_2.set_index('NAME'), on = 'NAME')
      df_comb = df_comb.loc[df_comb.STANCE == 'bipedal']
      df_comb['SPEED'] = (df_comb.STRIDE_LENGTH/df_comb.LEG_LENGTH - 1)*pd.Series.pow(df_comb.LEG_LENGTH*9.8,0.5)
      df_comb.sort_values('SPEED', ascending = False)
      

      不如 SQL 干净!

      【讨论】:

        【解决方案4】:

        您可以使用pandasql 在python 中编写SQL。

        【讨论】:

        • 这如何回答这个问题?
        猜你喜欢
        • 2010-09-13
        • 1970-01-01
        • 2017-11-07
        • 1970-01-01
        • 2017-08-15
        • 2012-08-11
        • 1970-01-01
        • 2020-08-14
        • 2020-03-06
        相关资源
        最近更新 更多