59 lines
1.8 KiB
Python
Executable File
59 lines
1.8 KiB
Python
Executable File
#!/usr/bin/env python
|
|
"""Merge salmon output count files."""
|
|
|
|
import argparse
|
|
from functools import reduce
|
|
|
|
import numpy as np
|
|
import pandas as pd
|
|
|
|
# Parse command line arguments:
|
|
parser = argparse.ArgumentParser(
|
|
description="""Merge tab separated files on a given field using pandas.""")
|
|
parser.add_argument(
|
|
'-j', metavar='join', help="Join type (outer).", default="outer")
|
|
parser.add_argument(
|
|
'-f', metavar='field',
|
|
help="Join on this field (Reference).", default="Reference")
|
|
parser.add_argument(
|
|
'-o', metavar='out_tsv',
|
|
help="Output tsv (merge_tsvs.tsv).", default="merge_tsvs.tsv")
|
|
parser.add_argument(
|
|
'-z', action="store_true",
|
|
help="Fill NA values with zero.", default=False)
|
|
parser.add_argument(
|
|
'-tpm', type=bool, default=False,
|
|
help="TPM instead of counts")
|
|
parser.add_argument(
|
|
'-tsvs', metavar='input_tsvs', nargs='*',
|
|
help="Input tab separated files.")
|
|
|
|
if __name__ == '__main__':
|
|
|
|
args = parser.parse_args()
|
|
dfs = {x: pd.read_csv(x, sep="\t") for x in args.tsvs}
|
|
|
|
ndfs = []
|
|
for x, df in dfs.items():
|
|
# Transform counts to integers:
|
|
if args.tpm:
|
|
df = df.rename(columns={'TPM': 'Count', 'Name': 'Reference'})
|
|
else:
|
|
df = df.rename(columns={'NumReads': 'Count', 'Name': 'Reference'})
|
|
df.Count = np.array(df.Count, dtype=int)
|
|
# Take only non-zero counts:
|
|
df = df[df.Count > 0]
|
|
df = df[["Reference", "Count"]]
|
|
df = df.sort_values(by=["Count"], ascending=False)
|
|
name = x.split('.')[0]
|
|
df = df.rename(columns={'Count': name})
|
|
ndfs.append(df)
|
|
dfs = ndfs
|
|
|
|
df_merged = reduce(lambda left, right: pd.merge(
|
|
left, right, on=args.f, how=args.j), dfs)
|
|
if args.z:
|
|
df_merged = df_merged.fillna(0)
|
|
|
|
df_merged.to_csv(args.o, sep="\t", index=False)
|