在熊猫中划分多列

约翰曼3910

我正在使用下表:

输入测试 输入_测试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

AB

您可以使用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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章