Pandas,去掉每个包含符号的单元格

2024-04-29 21:09:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含货币符号的列的数据框,我正在寻找一种有效的方法来剥离这些符号,以便将列的数据类型转换为浮动

数据帧:

          Date     Money(ILS)   
0   2020-05-02     ₪77,000.00   
1   2020-04-30     ₪80,600.00   
2   2020-07-29     ₪86,600.00     
3   2020-10-27    ₪113,963.00     
4   2021-01-25    ₪134,963.00    
5   2021-04-25    ₪155,963.00     
6   2021-07-24    ₪176,963.00     
7   2021-10-22    ₪197,963.00     
8   2022-01-20    ₪218,963.00     
9   2022-04-20    ₪239,963.00     
10  2022-07-19    ₪260,963.00  

我想把钱栏上的₪符号去掉

我的职能:

@classmethod
    def strip_symbols(cls):
        cls.df = cls.df.apply(lambda x: x.str.strip('₪') if x.dtype == TypesConsts.OBJECT else x)
        return cls.df

使用此方法,我得到以下错误:

AttributeError: Can only use .str accessor with string values!

Tags: 数据方法dfdatedef货币符号cls
2条回答

显然,您将lambda函数应用于整个数据帧(所有 列),因此对于除对象之外的任何类型的列 例外

实际上,您应该只对列应用此函数 持有货币内容

但还有其他潜在的问题来源:如果任何列具有对象 类型,然后通常其所有元素都包含字符串数据,但是 当某些元素包含例如浮点数据时,可能是“恶意”情况 (float仍然是对象的后代)

尝试这样一个例子:设置数据帧的一个元素(Money(ILS)column) 到浮动值:

df.iloc[2,1] = 86600.15

然后运行我建议的代码(仅剥离):

df['Money(ILS)'] = df['Money(ILS)'].apply(
    lambda x: x.strip('$') if type(x).__name__ == 'str' else x)

(我的测试数据包含$作为货币符号,所以我只使用了'$'

结果是:

        Date  Money(ILS)  Other
0 2020-05-02   77,000.00   Abcd
1 2020-04-30   80,600.00  23.16
2 2020-07-29     86600.1   Efgh
3 2020-10-27  113,963.00   Xxxx
4 2021-01-25  134,963.00     35
5 2021-04-25  155,963.00   Yyyy

​(我添加了一个额外的列,使用了更少的行)

现在:

  • 所有其他列都有其原始值
  • 货币符号仅从货币(ILS) 专栏
  • 但仅限于字符串类型的
  • 唯一的浮动值已打印为86600.1——无最终值 “5”,但这只是打印不准确(当您使用 iloc,您将获得正确的值)

但要将此列转换为浮点,还必须(事先)去掉逗号, 也仅在实际字符串中:

df['Money(ILS)'] = df['Money(ILS)'].apply(
    lambda x: x.replace(',', '') if type(x).__name__ == 'str' else x)

最终解决方案

您不需要逐步进行这些转换。只需使用以下代码, 一气呵成:

df['Money(ILS)'] = df['Money(ILS)'].apply(lambda x: float(
    x.strip('$').replace(',', '') if type(x).__name__ == 'str' else x))

现在,当您打印数据帧时:

  • 货币(ILS)属于浮动类型(请使用df.info()进行检查)
  • 甚至之前存在的float值也有.15结束,就像它一样 应该是

当然,如果有其他“货币”列,也可以将此代码应用于其他“货币”列

仅对对象数据类型的get列使用^{}

cols = cls.df.select_dtypes(TypesConsts.OBJECT).columns
cls.df[cols] = cls.df[cols].apply(lambda x: x.str.strip('₪'))

相关问题 更多 >