Python 根据$18信息对csv文件进行分类,并在每个类别中找到在$4中具有最大唯一编号的csv文件

Python 根据$18信息对csv文件进行分类,并在每个类别中找到在$4中具有最大唯一编号的csv文件,python,bash,csv,awk,Python,Bash,Csv,Awk,如果我们有三个示例输入文件: 测试_95_目标_1334_分析_Detail3.csv A,accession,result_id,cpd_number,lot_no,assay_id,alt_assay_id,version_no,result_type,type_desc,operator,result_value,unit_id,unit_value,unit_desc,batch_no,experiment_date,discipine,assay_name,activity_flag

如果我们有三个示例输入文件:

测试_95_目标_1334_分析_Detail3.csv

A,accession,result_id,cpd_number,lot_no,assay_id,alt_assay_id,version_no,result_type,type_desc,operator,result_value,unit_id,unit_value,unit_desc,batch_no,experiment_date,discipine,assay_name,activity_flag
95,PKC,123456,cpd-0123456,1,1334,5678,1,1,IC50,>,26.21,1,uM,micromolar,67682,1/24/2007 12:00:00AM,Enzymatic,PBA,
95,PKC,123456,cpd-0123456,1,1334,4600,1,1,IC50,,17.1,1,uM,micromolar,67682,1/24/2007 12:00:00AM,Enzymatic,PBA,
95,PKC,123456,cpd-1234567,1,1334,2995,1,1,Ki,,30,1,uM,micromolar,67682,1/24/2007 12:00:00AM,Enzymatic,PBA,
95,PKC,123456,cpd-1234567,1,1334,2900,1,1,IC50,,30,1,uM,micromolar,67682,1/24/2007 12:00:00AM,Enzymatic,PBA,
A,accession,result_id,cpd_number,lot_no,assay_id,alt_assay_id,version_no,result_type,type_desc,operator,result_value,unit_id,unit_value,unit_desc,batch_no,experiment_date,discipine,assay_name,activity_flag
95,PKC,123456,cpd-0123456,1,1338,3999,1,1,IC50,,55,1,uM,micromolar,67682,1/24/2007 12:00:00AM,Biochemical,PBA,
95,PKC,123456,cpd-0123456,1,1338,1985,1,1,IC50,,66,1,uM,micromolar,67682,1/24/2007 12:00:00AM,Biochemical,PBA,
95,PKC,123456,cpd-1234007,1,1338,2995,1,1,Ki,,18,1,uM,micromolar,67682,1/24/2007 12:00:00AM,Biochemical,PBA,
95,PKC,123456,cpd-1239867,1,1338,2900,1,1,IC50,,20,1,uM,micromolar,67682,1/24/2007 12:00:00AM,Biochemical,PBA,
95,PKC,123456,cpd-1234567,1,1338,2900,1,1,IC50,,20,1,uM,micromolar,67682,1/24/2007 12:00:00AM,Biochemical,PBA,
测试\u 95\u目标\u 1338\u分析\u详情3.csv

A,accession,result_id,cpd_number,lot_no,assay_id,alt_assay_id,version_no,result_type,type_desc,operator,result_value,unit_id,unit_value,unit_desc,batch_no,experiment_date,discipine,assay_name,activity_flag
95,PKC,123456,cpd-0123456,1,1334,5678,1,1,IC50,>,26.21,1,uM,micromolar,67682,1/24/2007 12:00:00AM,Enzymatic,PBA,
95,PKC,123456,cpd-0123456,1,1334,4600,1,1,IC50,,17.1,1,uM,micromolar,67682,1/24/2007 12:00:00AM,Enzymatic,PBA,
95,PKC,123456,cpd-1234567,1,1334,2995,1,1,Ki,,30,1,uM,micromolar,67682,1/24/2007 12:00:00AM,Enzymatic,PBA,
95,PKC,123456,cpd-1234567,1,1334,2900,1,1,IC50,,30,1,uM,micromolar,67682,1/24/2007 12:00:00AM,Enzymatic,PBA,
A,accession,result_id,cpd_number,lot_no,assay_id,alt_assay_id,version_no,result_type,type_desc,operator,result_value,unit_id,unit_value,unit_desc,batch_no,experiment_date,discipine,assay_name,activity_flag
95,PKC,123456,cpd-0123456,1,1338,3999,1,1,IC50,,55,1,uM,micromolar,67682,1/24/2007 12:00:00AM,Biochemical,PBA,
95,PKC,123456,cpd-0123456,1,1338,1985,1,1,IC50,,66,1,uM,micromolar,67682,1/24/2007 12:00:00AM,Biochemical,PBA,
95,PKC,123456,cpd-1234007,1,1338,2995,1,1,Ki,,18,1,uM,micromolar,67682,1/24/2007 12:00:00AM,Biochemical,PBA,
95,PKC,123456,cpd-1239867,1,1338,2900,1,1,IC50,,20,1,uM,micromolar,67682,1/24/2007 12:00:00AM,Biochemical,PBA,
95,PKC,123456,cpd-1234567,1,1338,2900,1,1,IC50,,20,1,uM,micromolar,67682,1/24/2007 12:00:00AM,Biochemical,PBA,
测试\u 95\u目标\u 2888\u分析\u详情3

Test,accession,result_id,cpd_number,lot_no,assay_id,alt_assay_id,version_no,result_type,type_desc,operator,result_value,unit_id,unit_value,unit_desc,batch_no,experiment_date,discipine,assay_name,activity_flag
95,PKC,123456,cpd-0123456,1,2888,3830,1,1,IC50,>,24.49,1,uM,micromolar,67682,1/24/2007 12:00:00AM,Cell,PBA,
95,PKC,123456,cpd-0123456,1,2888,4600,1,1,IC50,,19.6799,1,uM,micromolar,67682,1/24/2007 12:00:00AM,Cell,PBA,
95,PKC,123456,cpd-1234567,1,2888,3830,1,1,IC50,,30,1,uM,micromolar,67682,1/24/2007 12:00:00AM,Cell,PBA,
95,PKC,123456,cpd-5566778,1,2888,3830,1,1,IC50,,30,1,uM,micromolar,67682,1/24/2007 12:00:00AM,Cell,PBA,
是否有任何方法可以使用bash/awk(也欢迎python!)对第18列(18美元)为“酶”、“生化”和“细胞”的文件进行分类?我们的目标是从18美元的生化或酶中选择具有最大数量独特化合物(4美元)的文件,并从18美元的细胞中选择具有最大数量独特化合物的文件

在本例中,我们将从文件中选择“Test_95_target_1338_assay_Detail3.csv”,其中第18列为“酶”或“生化”。(因为“Test_95_target_1338_assay_Detail3.csv”在$4中有3个唯一的化合物,而“Test_95_target_1334_assay_Detail3.csv”只有2个唯一的化合物。3>2)在本例中,我们将为细胞类别选择“Test_95_target_2888_assay_Detail3.csv”,因为它是唯一的

尝试如下:此脚本将查找行数最多的csv文件,并将该文件名转换为变量,用于以下过程。我有另一个脚本来查找csv文件,它有最多的独特化合物($4)。我把脚本放在另一台笔记本电脑上,明天早上才能访问它。所以只需发布下面的一个

#!/bin/bash

for A in 95

do   

wc -l Test_${A}_target_*_assay_Detail_average.csv > Test_${A}_target.csv

### This will make

#4 Test_95_target_1334_assay_Detail3.csv
#4 Test_95_target_1338_assay_Detail3.csv
#4 Test_95_target_2388_assay_Detail3.csv
#13 Total

head -n -1 Test_${A}_target.csv > Test_${A}_target2.csv  # remove the last line "total"

sort -k1 -r -n Test_${A}_target2.csv > Test_${A}_target3.csv   # sort the count column

# Only pick the second column in the "wc -l" output

awk -F " " '{print $2}' Test_${A}_target3.csv > Test_${A}_target4.csv   # Grasp the $2 file name info

max=$(head -n 1 Test_${A}_target4.csv)   # Make the top file name as the variable "max" for the following process

echo $max

rm Test_${A}_target3.csv Test_${A}_target2.csv Test_${A}_target.csv

done
输出:

echo $max

Test_95_target_1338_assay_Detail3.csv

然而,我不太明白如何根据18美元的信息对csv文件进行分类。任何大师都能提供一些意见或解决方案吗?谢谢

此代码读取所有文件数据,然后获取其第18个位置(索引17,因为它是零基的),如果符合值条件,则将复合项添加到具有filename key的dict中。
我使用了一个集合,因为这个结构不存储重复的值
最后,您只需检查所有集合值,就可以知道哪个集合具有最大唯一值

import csv
files        = ['Test_95_target_1334_assay_Detail3.csv','Test_95_target_1338_assay_Detail3.csv', 'Test_95_target_2888_assay_Detail3.csv']
pos_to_check = 17 #zero based index
pos_compound = 3
values_to_check = ["enzymatic", "biochemical" , "cell"]
result = dict([(file,set([])) for file in files ]) #file : set of compounds

for file in files:   
    with open(file, 'r') as csvfile:
        csvreader = csv.reader(csvfile)
        for row in csvreader:   
            if row[pos_to_check].lower() in values_to_check:
                result[file].add(row[pos_compound])

#get key which has more elements
max(result.iterkeys(), key=(lambda key: len(result[key])))

这段代码读取所有文件数据,然后获取它的第18位(索引17,因为它是零基的),如果匹配值条件,则将化合物添加到带有文件名键的dict中。
我使用了一个集合,因为这个结构不存储重复的值
最后,您只需检查所有集合值,就可以知道哪个集合具有最大唯一值

import csv
files        = ['Test_95_target_1334_assay_Detail3.csv','Test_95_target_1338_assay_Detail3.csv', 'Test_95_target_2888_assay_Detail3.csv']
pos_to_check = 17 #zero based index
pos_compound = 3
values_to_check = ["enzymatic", "biochemical" , "cell"]
result = dict([(file,set([])) for file in files ]) #file : set of compounds

for file in files:   
    with open(file, 'r') as csvfile:
        csvreader = csv.reader(csvfile)
        for row in csvreader:   
            if row[pos_to_check].lower() in values_to_check:
                result[file].add(row[pos_compound])

#get key which has more elements
max(result.iterkeys(), key=(lambda key: len(result[key])))

更新的答案

根据您的意见,我尝试重新设计了
awk
,以满足您的新需求。我可能会对它们进行如下编码:

#!/bin/bash

# Do enzymatic/biochemical first

for f in *.csv; do
   awk -F, -v IGNORECASE=1 'NR>1 && ($18 ~ "enzymatic" || $18 ~ "biochemical") && $12<=10 {print $12,FILENAME}' "$f"
done | sort -n | tail -3

# Now do cell types

for f in *.csv; do
   awk -F, -v IGNORECASE=1 'NR>1 && $18 ~ "cell" && $12<=10 {print $12,FILENAME}' "$f"
done | sort -n | tail -3
它循环遍历所有
.csv
文件,并将它们一次传递到
awk

如果任何一行在字段18中有3个关键字(大写或小写)中的一个,它会设置一个标志,表示字段18是确定的,并且是您要查找的关键字之一。如果字段18不是您要查找的字段之一,则变量
fiedl18ok
将保持设置为零,并使打印在末尾的
答案
等于零

下一部分,起始
NR>1
仅适用于行号大于1的行,因此它基本上忽略了输入文件的标题行。然后,它通过在名为
col4[]
的数组中记住第4列中已经看到的所有值,对第4列中的唯一值求和。因此,我第一次向这个数组中添加1时,我增加了
u
(我在字段4中看到的唯一事物的数量)

最后,(
end{}
)它将field18ok乘以第4列中唯一化合物的数量。因此,如果field18不是您想要的,答案将为零,而如果field18是您要查找的值之一,则它将是Field4中唯一值的数量


然后对输出进行数字排序,以便您可以轻松地选择最高值。

更新的答案

根据您的评论,我尝试重新设计了
awk
,以满足您的新需求。我可能会对它们进行如下编码:

#!/bin/bash

# Do enzymatic/biochemical first

for f in *.csv; do
   awk -F, -v IGNORECASE=1 'NR>1 && ($18 ~ "enzymatic" || $18 ~ "biochemical") && $12<=10 {print $12,FILENAME}' "$f"
done | sort -n | tail -3

# Now do cell types

for f in *.csv; do
   awk -F, -v IGNORECASE=1 'NR>1 && $18 ~ "cell" && $12<=10 {print $12,FILENAME}' "$f"
done | sort -n | tail -3
它循环遍历所有
.csv
文件,并将它们一次传递到
awk

如果任何一行在字段18中有三个关键字(大写或小写)中的一个,它会设置一个标志,表示字段18是确定的,并且是您要查找的关键字之一。如果字段18不是您要查找的关键字之一,变量
fiedl18ok
将保持设置为零,并使打印在末尾的
答案
等于零

下一部分,从
NR>1开始
仅适用于行号大于1的行,因此它基本上忽略了输入文件的头行。然后,它通过在名为
col4[]的数组中记住第4列中已经看到的所有值,对第4列中的唯一值求和
。因此,第一次向这个数组添加1时,我增加了
u
(我在字段4中看到的独特事物的数量)

最后,(
end{}
)它将field18ok乘以第4列中唯一化合物的数量。因此,如果field18不是您想要的,答案将为零,而如果field18是您要查找的值之一,则它将是Field4中唯一值的数量


然后对输出进行数字排序,以便您可以轻松地选择最高值。

提示:
awk-F,{print$18}文件
以获取基于逗号分隔字段的第18个字段。.csv文件有多大(以行为单位)?如果没有太大,您可以将内容放入列表中并使用它们。您能给出一个预期输出的示例吗?提示:
awk-F,{print$18}文件
以逗号分隔的字段获取第18个字段。.csv文件有多大(以行为单位)?如果没有太大的内容,你可以将内容放入列表中并使用它们。你能给出一个预期输出的示例吗?经过一些小的修改,这非常有效!谢谢!你能解释一下这些是什么意思吗?“field18ok”,NR>1{If(!co