Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Apply a function including if to each row of a dataframe in pandas without for loop

Given a dataframe, I want to get the nonzero values of each row and then find the minimum of absolute values. I want to have a user defined function that does this for me. Also, I do not want to use any for loop since the data is big.

My try

np.random.seed(5)
data = np.random.randn(16)
mask = np.random.permutation(16)[:6]
data[mask] = 0
df = pd.DataFrame(data.reshape(4,4))

          0         1         2         3
0  0.441227 -0.330870  2.430771  0.000000
1  0.000000  1.582481 -0.909232 -0.591637
2  0.000000 -0.329870 -1.192765  0.000000
3  0.000000  0.603472  0.000000 -0.700179


def udf(x):
  if x != 0:
    x_min = x.abs().min()
  return x_min
df.apply(udf, axis=1)

I get ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

Question
How can I solve the above?

The desired answer is the following:

0.330870
0.591637
0.329870
0.603472

>Solution :

You can use x.ne(0) as boolean indexing to filter row

res = df.apply(lambda x: x[x.ne(0)].abs().min(), axis=1)
print(res)

0    0.330870
1    0.591637
2    0.329870
3    0.603472
dtype: float64

Or use min(axis=1)

res = df[df.ne(0)].abs().min(axis=1)
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading