Reputation: 67
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
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.
for col in (col_buyername, col_product):
df[col].fillna('', inplace=True)
df[[col_buyername, col_product]] = df[[col_buyername, col_product]].fillna('')
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