Given a DataFrame with Product Id and Amount:
df = pd.DataFrame([['504145', 12000.0],
                   ['555933', 23010.5]],
                  columns=['Product Id', 'Amount'])
df
Out[1]: 
  Product Id   Amount
0     504145  12000.0
1     555933  23010.5
I want to add a "Description" column based on Amount, which is expected to look like:
  Product Id   Amount        Description
0     504145  12000.0  Amount is 12000.0
1     555933  23010.5  Amount is 23010.5
When I use f-strings formatting, the result is aggregating the whole column Amount as a series instead of using the value of a particular row for string concatenation:
df['Description'] = f'Amount is {df["Amount"].astype(str)}'
df
Out[2]: 
  Product Id   Amount                                        Description
0     504145  12000.0  Amount is 0    12000.0\n1    23010.5\nName: Am...
1     555933  23010.5  Amount is 0    12000.0\n1    23010.5\nName: Am...
However, it works fine with simple string concatenation using +:
df['Description'] = "Amount is " + df["Amount"].astype(str)
df
Out[9]: 
  Product Id   Amount        Description
0     504145  12000.0  Amount is 12000.0
1     555933  23010.5  Amount is 23010.5
Why does f-strings formatting in a Pandas DataFrame behave like that? How should I fix it to use f-strings formatting? Or is it not suggested to use f-strings formatting for string concatenation in Pandas?
You need iterate by each value, e.g. by apply:
df['Description'] = df["Amount"].apply(lambda x: f'Amount is {x}')
Or by list comprehension:
df['Description'] = [f'Amount is {x}' for x in df["Amount"]]
print (df)
  Product Id   Amount        Description
0     504145  12000.0  Amount is 12000.0
1     555933  23010.5  Amount is 23010.5
Your solution:
df['Description'] = f'Amount is {df["Amount"].astype(str)}'
working different - it append each value of Series (also with index) to strings and repeat like constant for all values of new column.
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