I have a dataframe which can be constructed as:
df = pd.DataFrame({'A': [1, 4, 6, 3, 2, 3, 6, 8],
'B': [4, 7, 1, 5, 6, 8, 3, 9],
'C': [1, 5, 3, 1, 6, 8, 9, 0],
'D': [6, 3, 7, 8, 9, 4, 2, 1]})
The df looks like:
A B C D
0 1 4 1 6
1 4 7 5 3
2 6 1 3 7
3 3 5 1 8
4 2 6 6 9
5 3 8 8 4
6 6 3 9 2
7 8 9 0 1
And there are 2 other variables which are to be used in substitution of values in the df:
mx = pd.core.series.Series([7, 8, 8, 7], index=["A", "B", "C", "D"])
dm = pd.core.series.Series([5, 8, 6, 4], index=["A", "B", "C", "D"])
PROBLEM: I want to replace all the values from the dataframe greater than the corresponding value in dm but less than that in mx with the values from dm. In other words, let's say for "D", I want to replace all the values between 4 and 7 with 4.
So the expected output would look something like:
A B C D
0 1 4 1 4
1 4 7 5 3
2 5 1 3 4
3 3 5 1 8
4 2 6 6 9
5 3 8 6 4
6 5 3 9 2
7 8 9 0 1
I have tried using df.apply and df.update but I'm unable to make the condition. It always throws a ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
Is there an efficient way to achieve this? Any help would be appreciated.