I have a data like below:
Col1 F1 L1 F2 L2 F3 L3 A Jon Ro NaN NaN NaN NaN B Koss Lon Pet Gross NaN NaN C Lo NaN NaN NaN NaN NaN
I want to get count of non-missing based on F
and L
:
Col1 F1 L1 F2 L2 F3 L3 Cnt A Jon Ro NaN NaN NaN NaN 1 B Koss Lon Pet Gross NaN NaN 2 C Lo Pho NaN NaN NaN NaN 1
I tried below’s code but got wrong result since it considered F
and L
separate instead of based on their suffix:
df["Cnt"] = df[df.filter(regex = "F|L").columns.tolist()].apply(lambda x: x.count(), axis=1) Col1 F1 L1 F2 L2 F3 L3 Cnt A Jon Ro NaN NaN NaN NaN 2 B Koss Lon Pet Gross NaN NaN 4 C Lo Pho NaN NaN NaN NaN 1
Any idea?
Advertisement
Answer
df['Cnt'] = ( df.filter(regex="L|F") # select only L or F columns .groupby(lambda col: col[-1], axis=1) # group the columns by suffix (assuming it's just the last character) .agg(lambda g: g.notna().any(axis=1)) # for each i check if Fi or Li are not NaNs .sum(axis=1) # count the not-NaN groups row-wise (i.e. all the True values) ) >>> df Col1 F1 L1 F2 L2 F3 L3 Cnt 0 A Jon Ro NaN NaN NaN NaN 1 1 B Koss Lon Pet Gross NaN NaN 2 2 C Lo Pho NaN NaN NaN NaN 1