【问题标题】:Pandas, strip every cell containing symbol熊猫,剥离每个包含符号的单元格
【发布时间】:2020-09-02 23:23:54
【问题描述】:

我有一个 DataFrame,其中有一列包含货币符号,我正在寻找一种去除这些符号的有效方法,以便将列的数据类型转换为浮点数。

数据框:

          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!

【问题讨论】:

标签: python pandas


【解决方案1】:

显然,您将 lambda 函数应用于 whole DataFrame(所有 列),所以如果是 object 以外的任何类型的列,你有 一个例外。

实际上您应该仅将此功能应用于列(或列) 持有货币内容。

但还有其他潜在的问题来源:如果任何列有 object 类型,然后通常它的所有元素都包含字符串数据,但有 当某些元素包含例如浮动数据 (float 仍然是 object 的后代)。

试试这样的例子:设置 DataFrame 的一个元素(Money(ILS) 列) 到一个 float 值:

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

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

现在:

  • 所有其他列都有其原始值,
  • 货币符号仅从 Money(ILS) 中的单元格中删除 列,
  • 但仅限于字符串类型的,
  • 唯一的 float 值已打印为 86600.1 - 没有最终值 “5”,但它只是打印不准确(当您检索此单元格时 iloc,你会得到正确的值)。

但要将此列转换为 float,您还必须删除逗号(事先), 也仅在实际字符串中:

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))

现在当你打印 DataFrame 时:

  • Money(ILS) 是 float 类型(使用 df.info() 检查),
  • 即使之前出现的 float 值也有 .15 结尾,就像它一样 应该是。

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

【讨论】:

    【解决方案2】:

    使用DataFrame.select_dtypes 仅获取对象 dtype 的列:

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

    【讨论】:

      猜你喜欢
      • 2023-01-09
      • 2019-03-06
      • 1970-01-01
      • 2021-07-28
      • 2018-06-15
      • 2020-08-19
      • 1970-01-01
      • 2016-04-03
      相关资源
      最近更新 更多