Unable to Extract correct values from Pandas Series to use in np.select Function as default value. # With For Loop: Getting Perfect values in column “C” [“No”,”No”,4,4,4,4,4,4]
JavaScript
x
12
12
1
df = pd.DataFrame()
2
df["A"] = ["No","No","Max","Max","Min","Max","No","No"]
3
df["B"] = [5,9,4,3,7,6,8,1]
4
df["C"] = "No"
5
for i in range(1,len(df)-1):
6
if (df.iloc[i, 0]=="No") & ((df.iloc[1+i, 0]=="Max") or (df.iloc[1+i,
7
0]=="Min")):
8
df.iloc[1+i, 2] = df.iloc[1+i, 1]
9
else:
10
df.iloc[1+i, 2] = df.iloc[i, 2]
11
df
12
”’
JavaScript
1
15
15
1
# Without for Loop : Getting wrong values ["No","No",4,"No","No","No","No","No"] in
2
Column "C" instead of ["No","No",4,4,4,4,4,4].
3
df = pd.DataFrame()
4
df["A"] = ["No","No","Max","Max","Min","Max","No","No"]
5
df["B"] = [5,9,4,3,7,6,8,1]
6
df["C"] = None
7
8
A = (df["A"].shift(1).fillna("No").astype(str))
9
C = (df["C"].shift(1).fillna("No").astype(str))
10
conditions = [((A == "No") & ((df["A"].values == "Max") | (df["A"].values ==
11
"Min")))]
12
choices = [df["B"]]
13
df["C"] = np.select(conditions, choices, default = C)
14
df
15
”’
JavaScript
1
4
1
# How to get The Perfect Values in column "C" without using For loop.
2
# Unable to extract individual values from <class 'pandas.core.series.Series'> which
3
is defined as variable C.
4
Advertisement
Answer
You code is equivalent to:
JavaScript
1
5
1
m1 = df['A'].shift(1).eq('No') # previous row is No
2
m2 = df['A'].isin(['Min', 'Max']) # current row is Min or Max
3
# take B if both masks / ffill / replace NaN with original C
4
df['C'] = df['B'].where(m1&m2).ffill().fillna(df['C'])
5
output:
JavaScript
1
10
10
1
A B C
2
0 No 5 No
3
1 No 9 No
4
2 Max 4 4.0
5
3 Max 3 4.0
6
4 Min 7 4.0
7
5 Max 6 4.0
8
6 No 8 4.0
9
7 No 1 4.0
10
NB. If you want to keep the object type, use: df['C'] = df['B'].where(m1&m2).ffill().convert_dtypes().astype(object).fillna(df['C'])