我正在使用下表:
输入测试 | 输入_测试2 | 输入_测试3 | ip_test | ip_test2 | ip_test3 | |
---|---|---|---|---|---|---|
ENSG00000000003.15 | 1 | 1 | 1 | 3 | 3 | 3 |
ENSG00000000457.14 | 2 | 2 | 2 | 1 | 1 | 1 |
ENSG00000000460.17 | 2 | 2 | 2 | 3 | 3 | 3 |
ENSG00000001036.14 | 3 | 3 | 3 | 4 | 4 | 4 |
ENSG00000001167.14 | 3 | 3 | 3 | 5 | 5 | 5 |
我的目标是创建一个名为翻译效率的新列,将平均 ip 列除以平均输入列,我认为应该如下所示:
输入测试 | 输入_测试2 | 输入_测试3 | ip_test | ip_test2 | ip_test3 | 翻译效率 | |
---|---|---|---|---|---|---|---|
ENSG00000000003.15 | 1 | 1 | 1 | 3 | 3 | 3 | 3 |
ENSG00000000457.14 | 2 | 2 | 2 | 1 | 1 | 1 | 0.5 |
ENSG00000000460.17 | 2 | 2 | 2 | 3 | 3 | 3 | 1.5 |
ENSG00000001036.14 | 3 | 3 | 3 | 4 | 4 | 4 | 1.3 |
ENSG00000001167.14 | 3 | 3 | 3 | 5 | 5 | 5 | 1.6 |
到目前为止,我已经创建了一个带有以下参数的脚本:
python translational_efficiency.py --in_matrix all_reads_matrix.csv --ip_files ip_test ip_test2 ip_test3 --input_files input_test input_test2 input_test3 --save_path /Users/ks/Desktop/
请注意,--ip_files
和--input_files
参数将多列作为反映表中列出的列的列表。
我希望做这样的事情:
import argparse
import pandas as pd
def trans_eff(in_matrix, ip_files, input_files, save_path):
# call in original table without translational efficiency column
df = pd.read_csv(in_matrix, index_col=False)
# divide ip files columns by input files column into new column called translational_efficiency
df['translational_efficiency'] = df[ip_files[0]] / df[input_files[0]]
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Make a new matrix that includes translational '
'efficiencies from merge_matrix.py')
parser.add_argument("--in_matrix",
help='matrix made by merge_matrix.py')
parser.add_argument("--ip_files",
help='all ip files in as a list',
action='append',
nargs='*')
parser.add_argument("--input_files",
help='all input files in as a list',
action='append',
nargs='*')
parser.add_argument("--save_path",
help='path to save')
# parse out arguments
args = parser.parse_args()
# create csv with translational efficiencies
trans_eff(args.in_matrix, args.ip_files, args.input_files, args.save_path)
但是,这给了我以下错误: ValueError: Wrong number of items passed 6, placement implies 1
您可以使用startswith
字符串方法按前缀抓取列
input_cols = [col for col in df.columns if col.startswith('input_test')]
ip_cols = [col for col in df.columns if col.startswith('ip_test')]
并计算axis=1
这些列(每行)的平均值,并translational_efficiency
通过除以这些平均值得到一个新列。
df['translational_efficiency'] = df[ip_cols].mean(axis=1) / df[input_cols].mean(axis=1)
正如您在更新的问题和评论中所述,我想您可以直接使用 df[ip_files] 和 df[input_files] ,因为它们具有列名。您可以忽略列名提取部分
df['translational_efficiency'] = df[ip_files].mean(axis=1) / df[input_files].mean(axis=1)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句