【问题标题】:Add Thousands Separator to a DataFrame that Has Empty Strings using Pandas Style使用 Pandas 样式将数千个分隔符添加到具有空字符串的 DataFrame
【发布时间】:2016-11-27 23:03:26
【问题描述】:

这是this 的后续问题。

使用 Pandas 样式,我设法将数据框中的所有值格式化为以逗号作为千位分隔符的值。但是,当数据框中有空字符串时,格式化失败。

基本上,我的目标是从这个: 转换为这个:

谁能帮我解决这个问题?

这是我目前的代码:

import pandas as pd
from IPython.display import HTML

styles = [
    hover(),
    dict(selector = "th",
         props = [("font-size", "110%"),
                  ("text-align", "left"),
                  ("background-color", "#cacaca")
                 ]
        )
    ]

column_01 = ["", 2000000000, "", 21000000, 3000]
df = pd.DataFrame(column_01)

int_frmt = lambda x: "{:,}".format(x) # Integer
float_frmt = lambda x: "{:,.0f}".format(x) if x > 1e3 else "{:,.2f}".format(x) # Float
str_frmt = lambda x: "{:}".format(x) # <----- Added for empty strings but fails
frmt_map = {np.dtype("int64"): int_frmt,
            np.dtype("float64"): float_frmt,  
            np.dtype("S"): str_frmt # <----- Added for empty strings but fails
           }
frmt = {col: frmt_map[df.dtypes[col]] for col in df.columns if df.dtypes[col] in frmt_map.keys()}

html = (df.style.set_table_styles(styles).format(frmt))

html

【问题讨论】:

    标签: python pandas dataframe ipython


    【解决方案1】:

    使用 NumPy,您可以创建一个函数来进行转换,然后 vectorize() 它。然后可以将其应用于您的数据框,如下所示:

    import numpy as np
    
    def thousands(x):
        try:
            return '{:,}'.format(int(x))
        except ValueError as e:
            return x
    
    data = np.array(["","2000000000", "", "21000000", "3000"])
    f_thousands = np.vectorize(thousands)
    print f_thousands(data)
    

    给你:

    ['' '2,000,000,000' '' '21,000,000' '3,000']    
    

    这会尝试将条目转换为整数,然后使用格式的千位分隔符。如果转换失败,它会原封不动地返回传递的条目,例如空白

    有关详细信息,另请参阅 Python 的 Format Specification Mini-Language。


    使用 Pandas,可以按如下方式完成:

    import pandas as pd
    
    def thousands(x):
        try:
            return '{:,}'.format(int(x))
        except ValueError as e:
            return x
    
    data = pd.DataFrame(["","2000000000", "", "21000000", "3000"])
    print data.applymap(thousands)
    

    给你:

                   0
    0               
    1  2,000,000,000
    2               
    3     21,000,000
    4          3,000
    

    【讨论】:

    • 嗨,马丁。您的代码是否也适用于IPython.display Html?
    猜你喜欢
    • 2013-10-09
    • 2017-05-17
    • 2022-01-23
    • 2021-05-06
    • 1970-01-01
    • 2013-05-16
    • 2014-09-28
    • 1970-01-01
    • 2018-06-22
    相关资源
    最近更新 更多