Skip to content

feature #49580: support new-style float_format string in to_csv #61650

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 5 commits into
base: main
Choose a base branch
from

Conversation

pedromfdiogo
Copy link

@pedromfdiogo pedromfdiogo commented Jun 13, 2025

feat(to_csv): support new-style float_format strings using str.format

Detect and process new-style format strings (e.g., "{:,.2f}") in the float_format parameter of to_csv.

  • Check if float_format is a string and matches new-style pattern
  • Convert it to a callable (e.g., lambda x: float_format.format(x))
  • Ensure compatibility with NaN values and mixed data types
  • Improves formatting output for floats when exporting to CSV

Example:
df = pd.DataFrame([1234.56789, 9876.54321])
df.to_csv(float_format="{:,.2f}") # now outputs formatted values like 1,234.57 and support new-style without .format

…_csv

feat(to_csv): support new-style float_format strings using str.format

Detect and process new-style format strings (e.g., "{:,.2f}") in the
float_format parameter of to_csv.

- Check if float_format is a string and matches new-style pattern
- Convert it to a callable (e.g., lambda x: float_format.format(x))
- Ensure compatibility with NaN values and mixed data types
- Improves formatting output for floats when exporting to CSV

Example:
df = pd.DataFrame([1234.56789, 9876.54321])
df.to_csv(float_format="{:,.2f}")  # now outputs formatted values like
1,234.57

Co-authored-by: Pedro Santos <pedro.filipe.santos@tecnico.ulisboa.pt>
@pedromfdiogo
Copy link
Author

@simonjayhawkins Hi! Just wanted to check if this PR needs anything else from my side. Thanks in advance for reviewing

Comment on lines +860 to +865

if fmt is None:
return None

if callable(fmt):
return fmt
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
if fmt is None:
return None
if callable(fmt):
return fmt
if fmt is None or callable(fmt):
return fmt

except (ValueError, KeyError, IndexError) as e:
raise ValueError(f"Invalid new-style format string {fmt!r}") from e

# If fmt is neither None, nor callable, nor a successfully processed string,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
# If fmt is neither None, nor callable, nor a successfully processed string,

Comment on lines +784 to +785
with warnings.catch_warnings(record=True):
warnings.simplefilter("always")
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please use tm.assert_produces_warning

else:
try:
_ = fmt.format(1.0) # Test with an arbitrary float
return lambda x: fmt.format(x)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
return lambda x: fmt.format(x)
return fmt.format

@mroeschke
Copy link
Member

Could you add a whatsnew entry in v3.0.0.rst?

@mroeschke mroeschke closed this Jun 30, 2025
@mroeschke mroeschke reopened this Jun 30, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Enhancement IO CSV read_csv, to_csv
Projects
None yet
Development

Successfully merging this pull request may close these issues.

ENH: support new-style float_format string in to_csv
3 participants