Derik0003
Derik0003

Reputation: 67

Pandas does not fill nan values with empty string

I am trying to replace the Nan values with empty strings. This is the code I have

df.replace({r'[^\x00-\x7F]+': ''}, regex=True, inplace=True)
col_buyername = basicinfo.get('buyer_name')
col_product = basicinfo.get('product_name')
col_quantity = basicinfo.get('quantity')
col_price = basicinfo.get('price')
print(df[col_buyername])

df.loc[:, [col_buyername, col_product]].fillna("", inplace=True)

print('after')
print(df[col_buyername])

the output is

0          NaN
1          Roy Thomas
2          NaN
3          NaN

Name: buyer name, dtype: object

after

0          NaN
1          Roy Thomas
2          NaN
3          NaN

Name: buyer name, dtype: object

Why is the fillna nothing setting it to be blank strings?

Upvotes: 0

Views: 1554

Answers (1)

MaxNoe
MaxNoe

Reputation: 15017

Accessing with square brackets and a list of columns creates a copy, so you modify a temporary object, not the original dataframe.

You have three possible solutions, either pass a dict of column -> replacement for each column, assign or loop over the columns.

Looping

for col in (col_buyername, col_product):
    df[col].fillna('', inplace=True)

Assignment

df[[col_buyername, col_product]] = df[[col_buyername, col_product]].fillna('')

dict

df.fillna({col_buyername: '', col_product: ''}, inplace=True)

The loop and the dict approach should be a little more efficient than the reassignment.

For more info on when pandas created copies and when not, see https://stackoverflow.com/a/53954986/3838691

Upvotes: 3

Related Questions