Python pandas lambda compare two columns in dataframe

Question:

I have two columns of currencies in a, b;

There are some cells that are empty in both columns.

I am hoping to create a third column c to identified the following logic:

if a == b then display 'same'
elif a == None then display 'a missing'
elif b == None then display 'b missing'
elif a == None and b == None then display 'all missing'
else 'diff currency'.

These are my codes below. It just return ‘same’ or ‘diff currency’, nothing in between.

Please shed some lights on my syntax or logic flaws here. Thank you so much!

import pandas as pd

# list of currencies
a = list(('USD USD CAD nan JMD nan HKD CAD').split())

b = list(('USD CAD RMB HKD nan nan USD EUR').split())


# df
df = pd.DataFrame(list(zip(a, b)), columns=['a', 'b'])

df = df.replace('nan', '')


df['c'] = df.apply(lambda x: 'Same' if x['a'] == x['b'] 
                   else ('a missing' if x['a']==None
                         else ('b missing' if x['b']==None 
                         else ('a & b missing' if x['a']==None and x['b']==None
                         else 'diff currency'))), axis=1)
Asked By: Alan Huang

||

Answers:

It’s better if you learn how to use the vectorized functions. They are both idiomatic pandas and extremely fast. Use np.select:

a = df["a"]
b = df["b"]
df["c"] = np.select(
    [a.isna() & b.isna(), a.isna(), b.isna(), np.isclose(a, b)],
    ["all missing", "a missing", "b missing", "same"],
    "diff currency",
)
Answered By: Code Different

You can use np.select for this.

import pandas as pd
import numpy as np

# list of currencies
a = list(('USD USD CAD nan JMD nan HKD CAD').split())

b = list(('USD CAD RMB HKD nan nan USD EUR').split())

# df
df = pd.DataFrame(list(zip(a, b)), columns=['a', 'b'])

# change string `nan` into actual NaN values
df = df.replace('nan', np.nan)

condlist = [df.a == df.b, df.isna().all(axis=1), df.a.isna(), df.b.isna()]
choicelist = ['same', 'all missing', 'a missing', 'b missing']

df['c'] = np.select(condlist,choicelist,default='diff currency')
print(df)

     a    b              c
0  USD  USD           same
1  USD  CAD  diff currency
2  CAD  RMB  diff currency
3  NaN  HKD      a missing
4  JMD  NaN      b missing
5  NaN  NaN    all missing
6  HKD  USD  diff currency
7  CAD  EUR  diff currency
Answered By: ouroboros1