我正在寻找与excel中的vlookup函数等价的东西。我有一个脚本,我在csv文件中读取。我希望能够从.csv中的另一列查询关联值。到目前为止的脚本:
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)
我认为这可以直接解决您的问题:
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的先决条件。
答案 1 :(得分: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]
的末尾抛出一个csv
。
Python标准库中还有一个{{1}}模块,您可能更喜欢使用它。 =)
答案 2 :(得分:0)
对于任意排序和完全匹配,您可以使用indVar.index()
并使用返回的索引索引depVar
。
如果订购了indVar
并且(好,“或”,等等)您需要最接近的匹配,那么您应该在bisect
上使用indVar
。