创建一个剥离$的函数,转换为float并应用于pandas groupby

问题描述

我创建了一个函数,该函数去除数字中的“ $”并将其转换为浮点数,然后将总和添加到该列中。当我尝试向groupby调用函数时,出现了错误。这是代码

def total_sales():
    return df['Total sales USD'].str.strip('$').astype(float).sum()

df_order_sales_date = df.groupby(['column1','column2']).apply(total_sales)

我收到一条错误消息,提示“ TypeError:total_sales()接受0个位置参数,但给出了1个位置”

我该怎么办?是否可以创建一个剥离$的函数,将字符串转换为float并添加总数,然后将其应用于groupby中的列?感谢您的帮助

解决方法

您可以运行以下命令来对以string格式设置的货币/浮点数据求和,然后将格式调整为:

  1. 字符串
  2. 浮动

我已注释掉选项#1,该选项将返回一个字符串,因为我怀疑所需的结果可能是选项#2(浮点型,但使用$格式化,类似于在Excel中格式化浮点型)。我还显示了如果运行选项#1(字符串),输出结果是什么样的。我包含了print(df_order_sales_date.info()),以向您展示尽管从美学上讲结果是完全相同的,但数据类型和基础值实际上是不同的`:

import pandas as pd
df = pd.DataFrame({'column1': {0: 'A',1: 'A',2: 'B',3: 'B'},'column2': {0: 'a',1: 'b',2: 'a',3: 'a'},'Total sales USD': {0: '$10.05',1: '$20.45',2: '$5.50',3: '$15.25'}})
df['Total sales USD'] = df['Total sales USD'].str.strip('$').astype(float)
df_order_sales_date = df.groupby(['column1','column2'])['Total sales USD'].sum().reset_index()
# df_order_sales_date['Total sales USD'] = '$' + df_order_sales_date['Total sales USD'].astype(str) #option1
pd.options.display.float_format = '${:,.2f}'.format #option2
print(df_order_sales_date.info())
df_order_sales_date

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3 entries,0 to 2
Data columns (total 3 columns):
 #   Column           Non-Null Count  Dtype 
---  ------           --------------  ----- 
 0   column1          3 non-null      object
 1   column2          3 non-null      object
 2   Total sales USD  3 non-null      float64
dtypes: object(3)
memory usage: 200.0+ bytes
None

Out[3]: 
  column1 column2 Total sales USD
0       A       a          $10.05
1       A       b          $20.45
2       B       a          $20.75

但是,如果您选择选项#1,那么它将返回:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3 entries,0 to 2
Data columns (total 3 columns):
 #   Column           Non-Null Count  Dtype 
---  ------           --------------  ----- 
 0   column1          3 non-null      object
 1   column2          3 non-null      object
 2   Total sales USD  3 non-null      object
dtypes: object(3)
memory usage: 200.0+ bytes
None
Out[367]: 
  column1 column2 Total sales USD
0       A       a          $10.05
1       A       b          $20.45
2       B       a          $20.75