2013-06-01 2 views
2

Я ищу эквивалент функции vlookup в excel. У меня есть сценарий, где я читаю файл csv. Я хотел бы иметь возможность запрашивать связанное значение из другого столбца в .csv. Сценарий до сих пор:базовый эквивалент python vlookup

import matplotlib 
import matplotlib.mlab as mlab 
import glob 

for files in glob.glob("*.csv"): 
    print files 

    r = mlab.csv2rec(files) 
    r.cols = r.dtype.names 

    depVar = r[r.cols[0]] 
    indVar = r[r.cols[1]] 
    print indVar 

Это будет читать из CSV-файлов в одной папке скрипт находится в В приведенном выше примере depVar является первым столбцом в .csv и indVar является вторым столбцом.. В моем случае я знаю значение для indVar, и я хочу вернуть связанное значение для depVar. Я хотел бы добавить команду как:

depVar = r[r.cols[0]] 
indVar = r[r.cols[1]] 
print indVar 
depVarAt5 = lookup value in depVar where indVar = 5 (I could sub in things for the 5 later) 

В моем случае все значения во всех полях номера и все значения indVar уникальны. Я хочу, чтобы определить новую переменную (depVarAt5 в последнем примере), равную связанному значению.

Вот пример содержимого .csv, назовите файл и поместите его в ту же папку, что и скрипт. В этом примере параметр depVarAt5 должен быть установлен равным 16.1309.

Temp,Depth 
16.1309,5 
16.1476,94.4007 
16.2488,100.552 
16.4232,106.573 
16.4637,112.796 
16.478,118.696 
16.4961,124.925 
16.5105,131.101 
16.5462,137.325 
16.7016,143.186 
16.8575,149.101 
16.9369,155.148 
17.0462,161.187 
+0

Примерный входной файл и список ожидаемых результатов будут полезны. –

+1

И просто примечание, не относящееся к вашему вопросу: ваши данные численные и упорядоченные ... Поэтому я задаюсь вопросом, должно ли это представлять непрерывную функцию. В этом случае вам, вероятно, нужна какая-то интерполяция, а не просто поиск.(Excel VLOOKUP не выполняет интерполяцию, а скорее находит самое близкое значение.) –

ответ

1

Я думаю, что это решит вашу проблему достаточно прямо:

import numpy 
import glob 

for f in glob.glob("*.csv"): 
    print f 

    r = numpy.recfromcsv(f) 
    print numpy.interp(5, r.depth, r.temp) 

Я уверен, что NumPy является необходимым условием для Matplotlib.

+0

Спасибо. Это точно решает мою проблему – bigCow

0

Не уверен, что это r объект, но так как он имеет элемент под названием cols, я буду считать, что он также является членом называется rows, который содержит данные строки.

>>> r.rows 
[[16.1309, 5], [16.1476, 94.4007], ...] 

В этом случае ваш псевдокод почти содержит достоверное выражение генератора/список.

depVarAt5 = lookup value in depVar where indVar = 5 (I could sub in things for the 5 later) 

становится

depVarAt5 = [row[0] for row in r.rows if row[1] == 5] 

Или, в более общем

depVarValue = [row[depVarColIndex] for row in r.rows if row[indVarColIndex] == searchValue] 

так

def vlookup(rows, searchColumn, dataColumn, searchValue): 
    return [row[dataColumn] for row in rows if row[searchColumn] == searchValue] 

Бросок [0] на конце, что если вы можете гарантировать, что будет точно один выход на каждый вход.

В стандартной версии Python также есть модуль csv, с которым вы, возможно, захотите работать. =)

+0

Нет r.rows. Я отредактировал сообщение немного после оригинального сообщения, где я определил r. Я не могу заставить ваше решение работать как есть, но спасибо за попытку – bigCow

0

Для произвольных заказов и точных совпадений вы можете использовать indVar.index() и индекс depVar с возвращенным индексом.

Если indVar заказано и (ну, или «,»), вам нужно ближайшее совпадение, тогда вы должны посмотреть на использование bisect на indVar.

Смежные вопросы