How to replace pandas column value with condition?

Viewed 49

I need to replace columnb value with a mapping dictionary, but I cannot split those columns and map it and the concat everything back to same place that would be a tedious task. Any help on this would be great.

df:

ColumnA   ColumB
0 Rick     3-1,4-5,9-8
1 Tim      6-3,1-2,1.3,5.8,7-9

Mapping_dict= {'3-1':'1','4-5':2,'9-8':3,
'6-3':4,'1-2':5,'1.3':6,'5.8':'7','7-9':'8'}

Output:

  ColumnA   ColumB
  0 Rick     1,2,3
  1 Tim      4,5,6,7,8
3 Answers

You can use pandas apply function to map the original value with your mapping dictionary:

import pandas as pd

Mapping_dict= {'3-1':'1','4-5':2,'9-8':3,'6-3':4,'1-2':5,'1.3':6,'5.8':'7','7-9':'8'}
d = {'ColumnA': ['Rick', 'Tim'], 'ColumB': ['3-1,4-5,9-8', '6-3,1-2,1.3,5.8,7-9']}
df = pd.DataFrame(data=d)
df['ColumB'] = df['ColumB'].apply(lambda x: [Mapping_dict[y] for y in x.split(',')] )

Assuming your Mapping_dict contains all values as string you can use Series.replace which accepts a replacement dictionary as an argument which then can be used to replace the values in ColumB:

df['ColumB'] = df['ColumB'].replace(Mapping_dict, regex=True)

>>> df

  ColumnA     ColumB
0    Rick      1,2,3
1     Tim  4,5,6,7,8
ColumnA=['Rick','Tim']  
ColumnB=['3-1,4-5,9-8','6-3,1-2,1.3,5.8,7-9']

df=pd.DataFrame({'columnA':ColumnA,'columnB':ColumnB})

Mapping_dict= {'3-1':'1','4-5':2,'9-8':3,'6-3':4,'1-2':5,'1.3':6,'5.8':'7','7-9':'8'}

def lookup(columnString):
    elements=columnString.split(",")
    mylist=[str(Mapping_dict[element]) for element in elements]
    retVal=",".join(mylist)
    return retVal

df['columnB']=df['columnB'].apply(lambda x: lookup(x))
print(df)
output:

  columnA    columnB
0    Rick      1,2,3
1     Tim  4,5,6,7,8
Related