Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Convert Pandas DataFrame Column From String to Int Based on Conditional

I have a dataframe that looks like

df

viz  a1_count  a1_mean     a1_std
n         3        2   0.816497
y         0      NaN        NaN 
n         2       51  50.000000

I want to convert the "viz" column to 0 and 1, based on a conditional. I've tried:

df['viz'] = 0 if df['viz'] == "n" else 1

but I get:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
like image 396
Adam_G Avatar asked Aug 03 '15 14:08

Adam_G


People also ask

How do I convert an entire column to an int panda?

Convert Column to int (Integer)Use pandas DataFrame. astype() function to convert column to int (integer), you can apply this on a specific column or on an entire DataFrame. To cast the data type to 64-bit signed integer, you can use numpy. int64 , numpy.


2 Answers

You're trying to compare a scalar with the entire series which raise the ValueError you saw. A simple method would be to cast the boolean series to int:

In [84]:
df['viz'] = (df['viz'] !='n').astype(int)
df

Out[84]:
   viz  a1_count  a1_mean     a1_std
0    0         3        2   0.816497
1    1         0      NaN        NaN
2    0         2       51  50.000000

You can also use np.where:

In [86]:
df['viz'] = np.where(df['viz'] == 'n', 0, 1)
df

Out[86]:
   viz  a1_count  a1_mean     a1_std
0    0         3        2   0.816497
1    1         0      NaN        NaN
2    0         2       51  50.000000

Output from the boolean comparison:

In [89]:
df['viz'] !='n'

Out[89]:
0    False
1     True
2    False
Name: viz, dtype: bool

And then casting to int:

In [90]:
(df['viz'] !='n').astype(int)

Out[90]:
0    0
1    1
2    0
Name: viz, dtype: int32
like image 171
EdChum Avatar answered Oct 16 '22 16:10

EdChum


From @TMWP's comment above:

pd.to_numeric(myDF['myDFCell'], errors='coerce')

It works like a charm and is a quick and simple one liner

like image 4
Display name Avatar answered Oct 16 '22 16:10

Display name