Запрос файлов csv в python, например sql - PullRequest
0 голосов
/ 20 июня 2020

Это, по-видимому, популярный вопрос для интервью.
Есть 2 файла CSV с данными о динозаврах. Нам нужно запросить их, чтобы они вернули динозавров, удовлетворяющих определенному условию.

Примечание. Мы не можем использовать дополнительные модули, такие как q, f sql, csvkit et c.

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

используя forumla: speed = ((STRIDE_LENGTH / LEG_LENGTH) - 1) * SQRT (LEG_LENGTH * g), где g = 9,8 м / с ^ 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?

Ответы [ 3 ]

1 голос
/ 20 июня 2020

Вы можете сделать это в pandas,

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!

0 голосов
/ 26 июня 2020
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)
0 голосов
/ 20 июня 2020

Вы можете написать SQL в python, используя panda sql.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...