python pandas:如何在latex中格式化10次幂的大数字

ijnw1ujt  于 2023-04-28  发布在  Python
关注(0)|答案(3)|浏览(226)

我正在使用pandas生成一些带有大/小数字的大型LaTex表:

df = pd.DataFrame(np.array(outfile),columns=['Halo','$r_{v}$','etc'])
df.to_latex("uvFlux_table_{:.1f}.tex".format(z))

其中“outfile”只是一个数字表(3列)。..我怎样才能得到outfile中的数字格式如下:

$1.5x10^{12}$  &   $1.5x10^{12}$  &  $1.5x10^{-12}$

就像你在科学出版物上看到的那样。.. vs默认值

0.15e13 & 0.15e13 & 0.15e-11

??

y53ybaqx

y53ybaqx1#

定义

def format_tex(float_number):
    exponent = np.floor(np.log10(float_number))
    mantissa = float_number/10**exponent
    mantissa_format = str(mantissa)[0:3]
    return "${0}\times10^{{{1}}}$"\
           .format(mantissa_format, str(int(exponent)))

你可以在dataframe上applymap这个函数(也可以在series上应用)

df = pd.DataFrame({'col':[12345.1200000,100000000]})
df.applymap(lambda x:format_tex(x))

这给已经特克斯输出木星笔记本电脑。请注意,这里的转义可能很棘手。其他更快的解决方案?

pbpqsu0x

pbpqsu0x2#

感谢@Quickbeam2k1的回答。我已经扩展到处理0和负数:

# Define function for string formatting of scientific notation
def exp_tex(float_number):
    """
    Returns a string representation of the scientific
    notation of the given number formatted for use with
    LaTeX or Mathtext.
    """
    neg = False
    if float_number == 0.0:
        return r"$0.0"
    elif float_number < 0.0:
        neg = True

    exponent = np.floor(np.log10(abs(float_number)))
    mantissa = float_number/10**exponent
    if neg:
        mantissa = -mantissa
    mantissa_format = str(mantissa)[0:3]
    return "${0}\\times10^{{{1}}}$"\
           .format(mantissa_format, str(int(exponent)))
nvbavucw

nvbavucw3#

我认为在这里不重新发明轮子可能是一个更好的主意,并使用python给我们的float格式化工具:

def float_exponent_notation(float_number, precision_digits, format_type="g"):
    """
    Returns a string representation of the scientific
    notation of the given number formatted for use with
    LaTeX or Mathtext, with `precision_digits` digits of
    mantissa precision, printing a normal decimal if an
    exponent isn't necessary.
    """
    e_float = "{0:.{1:d}{2}}".format(float_number, precision_digits, format_type)
    if "e" not in e_float:
        return "${}$".format(e_float)
    mantissa, exponent = e_float.split("e")
    cleaned_exponent = exponent.strip("+")
    return "${0} \\times 10^{{{1}}}$".format(mantissa, cleaned_exponent)

这个版本对于零、负数等是安全的。它是圆的(其他人都没有!)。它还提供了使用"g"代码的选项,如果小数点在您设置的精度范围内,则将使用小数显示数字。
此外,如果还传递escape=False,则可以将这些作为格式化程序传递给.to_latex方法。我有一个格式化程序 Package 器,它可以进行类型检查,如果遇到字符串,则会转义。

相关问题