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?
 
    