【问题标题】:Pandas format column as currencyPandas 将列格式化为货币
【发布时间】:2016-05-03 07:55:03
【问题描述】:

给定以下数据框:

import pandas as pd
df = pd.DataFrame(
        {'A':['A','B','C','D'],
         'C':[12355.00,12555.67,640.00,7000]
        })
df

    A   C
0   A   12355.00
1   B   12555.67
2   C   640.00
3   D   7000.00

我想将这些值转换为以千美元为单位的美元,如下所示:

    A   C
0   A   $12.3K
1   B   $12.5K
2   C    $0.6K
3   D    $7.0K

我需要做的第二件事是以某种方式将它们放入 Seaborn 热图,它只接受浮点数和整数。有关热图方面的更多信息,请参阅here

我假设一旦浮点数转换为货币,它们将是对象格式,但我希望有办法解决这个问题。

提前致谢!

【问题讨论】:

    标签: python-3.x pandas seaborn


    【解决方案1】:

    Flexibile formatting using Babel

    如果您正在寻找一种针对不同区域设置货币和数字格式的灵活方式,我建议使用Babel

    示例数据

    df = pd.DataFrame(
            {'A':['A','B','C','D'],
             'C':[12355.00,12555.67,640.00,7000]
            })
    print(df)
    
       A         C
    0  A  12355.00
    1  B  12555.67
    2  C    640.00
    3  D   7000.00
    

    格式化美元货币:

    from babel.numbers import format_currency
    
    df["C"] = df["C"].apply(lambda x: format_currency(x, currency="USD", locale="en_US"))
    
       A           C
    0  A  $12,355.00
    1  B  $12,555.67
    2  C     $640.00
    3  D   $7,000.00
    

    格式化欧元货币(注意千位和小数分隔符的区别):

    df["C"] = df["C"].apply(lambda x: format_currency(x, currency="EUR", locale="nl_NL"))
    
       A            C
    0  A  € 12.355,00
    1  B  € 12.555,67
    2  C     € 640,00
    3  D   € 7.000,00
    

    【讨论】:

    • 这很棒。感谢您提及!
    【解决方案2】:

    或者您可以使用lambda functionf-string 以获得更短的语法更短 更短的语法

    df['C'] = df['C'].apply(lambda x: f"${x/1000:.1f}k")
    

    如果您想在特定的列列表上使用此方法,您可以在循环中参数化列名

    for col in ['A', 'B', 'C']:
        df[col] = df[col].apply(lambda x: f"${x/1000:.1f}k")
    

    如果你想在所有列上使用这个方法,你可以用applymap替换apply

    df = df.applymap(lambda x: f"${x/1000:.1f}k")
    

    【讨论】:

    • 对于多个列,您需要像 this answer 一样传递。 df[["A", "B", "C"]] = df[["A", "B", "C"]].apply(lambda series: series.apply(lambda value: f"{value:,}") )
    【解决方案3】:
        def format(x):
            return "${:.1f}K".format(x/1000)
    
    
        df = pd.DataFrame(
            {'A':['A','B','C','D'],
             'C':[12355.00,12555.67,640.00,7000]
            })
    
        df['C'] = df['C'].apply(format)
    
        print(df)
    

    【讨论】:

    • 您也可以使用locale.currency(value, grouping=True),但您需要导入并设置本地:locale.setlocale(locale.LC_ALL, 'en_US')
    【解决方案4】:

    或者您可以使用 lambda 函数来缩短语法

    df['C'] = df['C'].apply(lambda x: "${:.1f}k".format((x/1000)))
    

    【讨论】:

    猜你喜欢
    • 2018-01-07
    • 1970-01-01
    • 2015-03-20
    • 1970-01-01
    • 1970-01-01
    • 2016-04-25
    • 2012-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多