I have a column in my dataframe where the values take on either 1, 0, False but the rows with False or O are functionally different.
I would therefore like to convert either the False or 0 values to something else
What would be an good way to do this?
Using replace has not worked well
df["col_name"] = df["col_name"].replace(0,2) converts the False values too
and
df["col_name"] = df["col_name"].replace(False,2) converts the 0 values too
Pandas DataFrame all() Method. Pandas all() method is used to check whether all the elements of a DataFrame are zero or not. It returns either series or DataFrame containing True and False values, if the level parameter is specified then it returns DataFrame, Series otherwise.
In order to check null values in Pandas DataFrame, we use isnull() function this function return dataframe of Boolean values which are True for NaN values.
It means: 'O' (Python) objects. Source. The first character specifies the kind of data and the remaining characters specify the number of bytes per item, except for Unicode, where it is interpreted as the number of characters. The item size must correspond to an existing type, or an error will be raised.
You can use mask to replace values with a boolean mask - the advantage of this solution is no original types are changed:
df = pd.DataFrame({'Col':[1, False, 0]})
df['Col'] = df['Col'].mask(df['Col'].astype(str) == '0', 2).replace(False, 3)
print (df)
Col
0 1
1 3
2 2
Solution with Series.replace by dict, but first converting to str by astype works too, but generally it convert all values to str what with real data can be problem.
d = {'0':'Zero', 'False':False}
df = df['Col'].astype(str).replace(d)
print (df)
0 1
1 False
2 Zero
Name: Col, dtype: object
I try create more general solution with map and checking bools by isinstance:
df = pd.DataFrame({'Col':[1, False, 0, True,5]})
print (df)
Col
0 1
1 False
2 0
3 True
4 5
m = df['Col'].apply(lambda x: isinstance(x, bool))
df['Col'] = df['Col'].mask(m, df['Col'].map({False:2, True:3}))
print (df)
Col
0 1
1 2
2 0
3 3
4 5
You can convert to str type and then use df.str.replace:
In [223]: df = pd.DataFrame({'Col':[1, False, 0]})
In [224]: df.Col.astype(str).replace('0', 'Zero').replace('False', np.nan)
Out[224]:
0 1
1 NaN
2 Zero
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With