Problem
I have a function that takes as input a str
and returns a dict
. I would like to apply this function to a specific column of every row of a pandas dataframe, and have it create new columns with the returned dictionary
Function
example = "TGGCCCGCGAACTTGCCCGAAGCCCTCGTTCCCTGTCGGCTCTAACCGCTGGTGTAGTGG[CG]GAGCACGCGAACTTAGCAAGGGCTAAGCGATCAGGAATAAGAACAGCAGGAAAGCCAGAG"
def freqcount(s):
bases = "".join(s.split("[CG]"))
total = len(bases)
outdic = {}
for b1 in ["A", "G", "C", "T"]:
outdic[b1] = bases.count(b1)/total
for b2 in ["A", "G", "C", "T"]:
outdic[b1+b2] = bases.count(b1+b2)/total
return outdic
print(freqcount(example))
{'A': 0.25833333333333336, 'AA': 0.08333333333333333, 'AG': 0.10833333333333334, 'AC': 0.041666666666666664, 'AT': 0.016666666666666666, 'G': 0.30833333333333335, 'GA': 0.075, 'GG': 0.058333333333333334, 'GC': 0.10833333333333334, 'GT': 0.041666666666666664, 'C': 0.275, 'CA': 0.05, 'CG': 0.075, 'CC': 0.05, 'CT': 0.06666666666666667, 'T': 0.15833333333333333, 'TA': 0.041666666666666664, 'TG': 0.05, 'TC': 0.041666666666666664, 'TT': 0.025}
Dataframe
print(df_dna)
Forward_Sequence
cg00050873 TATCTCTGTCTGGCGAGGAGGCAACGCACAACTGTGGTGGTTTTTG...
cg00212031 CCATTGGCCCGCCCCAGTTGGCCGCAGGGACTGAGCAAGTTATGCG...
cg00213748 TCTGTGGGACCATTTTAACGCCTGGCACCGTTTTAACGATGGAGGT...
cg00214611 GCGCCGGCAGGACTAGCTTCCGGGCCGCGCTTTGTGTGCTGGGCTG...
cg00455876 CGCGTGTGCCTGGACTCTGAGCTACCCGGCACAAGCTCCAAGGGCT...
... ...
ch.22.909671F TTTTCCTTTTAGCTGCTGATAGATTAATAGTATGTGAACCTTTTAA...
ch.22.46830341F TGTGCATACATGCGCATGTGAACAGTCCATGGAGCTTAATCCCCTG...
ch.22.1008279F CTGGCAGGGCACACACCTCAGCTGGGCCCTGTGGCAGGTGAACCCC...
ch.22.47579720R ATGTACCCATACGGGAAAGGCCGCGTGAAGATGGAGACAGAGATGG...
ch.22.48274842R AGTGTAGAATTTGGGGCTCGCCCTGTTGGTTCCTCCGGTGTGAAGG...
[485512 rows x 1 columns]
Expected output
I would like to have new columns, A
, AA
, AG
, ..., and have the dictionary values in the correct column for each row.
Output i get so far
However this is what I get.
print(df_dna.applymap(freqcount))
Forward_Sequence
cg00050873 {'A': 0.21666666666666667, 'AA': 0.04166666666...
cg00212031 {'A': 0.21666666666666667, 'AA': 0.04166666666...
cg00213748 {'A': 0.18333333333333332, 'AA': 0.01666666666...
cg00214611 {'A': 0.14166666666666666, 'AA': 0.025, 'AG': ...
cg00455876 {'A': 0.15, 'AA': 0.025, 'AG': 0.0833333333333...
cg01707559 {'A': 0.10833333333333334, 'AA': 0.01666666666...
cg02004872 {'A': 0.13333333333333333, 'AA': 0.0, 'AG': 0....
cg02011394 {'A': 0.175, 'AA': 0.016666666666666666, 'AG':...
cg02050847 {'A': 0.175, 'AA': 0.025, 'AG': 0.05, 'AC': 0....
cg02233190 {'A': 0.225, 'AA': 0.03333333333333333, 'AG': ...
I get same result with
print(df_dna.apply(lambda row: freqcount(row["Forward_Sequence"]), axis=1))
Anyone have an idea how I can achieve the desired result?