Python通过列搜索

Posted

技术标签:

【中文标题】Python通过列搜索【英文标题】:Python searching through columns 【发布时间】:2017-02-21 20:51:38 【问题描述】:

我有一个 CSV 文件,我需要以特定模式循环遍历特定列,并将输出模式存储在具有相同名称 +“_pattern”+ [1、2、3 等] 的新文件中+ .csv。

这是搜索模式:遍历第 1 列并找到相同的 # 并抓取它们,然后遍历抓取列表的第 2 列,然后在第 2 列中抓取所有具有相同日期的内容,然后转到第 4 列并抓取所有不一样的#s,然后使用第 1 列、第 2 列和第 4 列中的模式创建一个文件,按列时间组织。

例子:

1       2           time    4
13.45   9/29/2016   6:00    98765
12.56   9/29/2016   6:05    76548
13.45   9/29/2016   6:07    98764
13.45   9/29/2016   6:21    98766
13.45   9/29/2016   6:20    96765
12.56   9/29/2016   6:06    76553

Better view of table

结果是,file_pattern_1.csv 会:

1. 13.45    9/29/2016   6:00    98765
2. 13.45    9/29/2016   6:07    98764
3. 13.45    9/29/2016   6:21    98766

但不包括:

4. 13.45    9/29/2016   6:20    96765 

由于第 4 列与前一个条目重复,因此 file_pattern_2.csv 将具有:

1. 12.56    9/29/2016   6:05    76548
2. 12.56    9/29/2016   6:06    76553

这是我到目前为止所拥有的,但我已经迷失了循环逻辑:

import os

infile = raw_input("Which file are we working with? ")
assert os.path.exists(infile), "Path is incorrect."
os.chdir(infile)

def createFile(csvFile, fileName):
    with open (fileName, 'wb') as ftext:
        ftext.write(csvFile)

def appendFile(csvFile, fileName):
    with open (fileName, 'a') as ftext:
        ftext.write(csvFile)

def setfilename(tread):
    fileName = tread[0:tread.index('.')] + '_patterns' + str(countItem) + '.csv'
    return fileName

for i in pcolumn:
    if pcolumn == pcolumn:
        return pfile
    for x in date:
        if date == date:
            return date
            for a in acolumn:
                if acolumn != acolumn:
                    createFile(fileName)
else:
    print "Finished."

【问题讨论】:

使用 pandas 包。 df[['col1','col2','col4']].drop_duplicates() 将有助于消除重复项,然后遍历 df.groupby('col1') 以转储文件 在您的示例中,您的所有第 4 列条目都是唯一的? @MartinEvans 没错;第 4 列的条目都是 unquie。 【参考方案1】:

以下应该可以满足您的需求。它读取一个 csv 文件并为每个条目生成一个匹配的datetime 以允许它们被正确排序。它根据模式编号创建输出 csv 文件,其中条目按日期排序。已经看到的第 4 列条目被省略:

from itertools import groupby
from datetime import datetime
import csv
import os

filename = 'my_data.csv'
data = []

with open(filename, 'rb') as f_input:
    csv_input = csv.reader(f_input, delimiter='\t')
    header = next(csv_input)

    for row in csv_input:
        dt = datetime.strptime(' '.format(row[2], row[1]), '%H:%M %m/%d/%Y')
        data.append([dt] + row)

for index, (k, g) in enumerate(groupby(sorted(data, key=lambda x: x[1]), key=lambda x: x[1]), start=1):
    line = 1
    seen = set()

    with open('_pattern_.csv'.format(os.path.splitext(filename)[0], index), 'wb') as f_output:
        csv_output = csv.writer(f_output)

        for item in sorted(g, key=lambda x: x[0]):
            if item[4] not in seen:
                seen.add(item[4])
                csv_output.writerow([line] + item[1:])
                line += 1

【讨论】:

有趣的方法!谢谢! lambda 只是单行函数的简写。如果需要,可以将其替换为具有名称的普通函数。所以在我的例子中,它只有一个参数 x 并返回 x[1]【参考方案2】:

当您遍历文件时,您需要记录哪些模式不符合保存条件。为此,您可以使用set。要将每个文件中的条目分组,您可以使用itertools.groupby。使用您的示例:

import itertools

f = [i.split("   ") for i in """1       2           time    4
13.45   9/29/2016   6:00   98765
12.56   9/29/2016   6:05   76548
13.45   9/29/2016   6:07   98764
13.45   9/29/2016   6:21   98766
13.45   9/29/2016   6:20   96765
12.56   9/29/2016   6:06   76553""".split("\n")[1:]]


seen_patterns = set([('9/29/2016', '96765')])   # You need to add entries to this set which you want to exclude

# Sort and group your entries by the first and second columns
col1 = itertools.groupby(sorted(f, key=lambda x: (x[0], x[1])), key=lambda x: (x[0], x[1]))
for k, v in col1:
    v = list(v)
    # Filter out patterns which are not allowed
    to_save = [" ".join(i) for i in v if (i[1], i[3]) not in seen_patterns]
    for i in to_save:
        print i  # Save this to an appropriate file
    print

>>>
12.56 9/29/2016 6:05 76548
12.56 9/29/2016 6:06 76553

13.45 9/29/2016 6:00 98765
13.45 9/29/2016 6:07 98764
13.45 9/29/2016 6:21 98766

作为进一步的建议,看看glob 用于从目录中收集文件路径的模块,它真的很有用。

【讨论】:

非常感谢!问题:在您的代码中,lamba 到底做了什么?我以前见过并使用过它,但一直无法理解为什么 lamba 有效。 一开始可能有点混乱,但 lambda 只是一个简单函数的语法。我建议搜索一些示例来帮助您了解这个想法

以上是关于Python通过列搜索的主要内容,如果未能解决你的问题,请参考以下文章

在使用数字列表搜索列后返回数据框中的所有行 - Python/Pandas

在搜索循环中设置变量列通过工作表不起作用,

如何通过在 java-sql 应用程序上输入所有列数据来过滤搜索?

使用 Python 从 csv 文件中的字符串搜索中打印多列

DataTables 与 colvis 冲突的单个列搜索框

jQuery:通过搜索输入隐藏表格行,解决 td rowspan 和 colspan