如何在熊猫中应用公式

时间:2018-08-25 05:38:46

标签: python-3.x pandas

我正在尝试在列中应用公式,但无法应用。

我在数据框中有数据:

Date                  2018-04-16 00:00:00
Quantity                         8317.000
Total Value (Lacs)              259962.50

我想在Total Value (Lacs)列中应用公式

公式为:= [ Total Value (Lacs) multiplied by 100000 ] divided by [Quantity (000’s) multiplied by 100]通过使用熊猫

我尝试过一些东西

a = df['Total Value (Lacs)']
b = df['Quantity']

c = (a * 100000 / b * 100)
print (c)

or 

df['Price'] = ((df['Total Value (Lacs)']) * 100000 / (df['Quantity']) * 100)
print (df)

错误:

  

TypeError:/的不支持的操作数类型:“ str”和“ str”

修改

我尝试了以下代码:

df['Price'] = float((float(df['Total Value (Lacs)'])) * 100000 / float((df['Quantity'])) * 100)    

但是得到了错误的值

price     312567632.6

期待

price     31256.76326

3 个答案:

答案 0 :(得分:0)

出现此错误是因为从数据框中提取的数据是字符串,如错误所示,您需要将字符串转换为浮点数。

将数据框转换为值而不是字符串。您可以通过以下方式实现这一目标:

values = df.values

然后,您可以从此数组中提取值。

或者,从数据框中提取数据后,使用以下方法将其转换为浮点数:

b=float(df['Quantity'])

答案 1 :(得分:0)

使用此:

df['price'] = ((df['Total Value (Lacs)'].apply(pd.to_numeric)) * 100000 / (df['Quantity'].apply(pd.to_numeric)) * 100)

答案 2 :(得分:0)

编辑1 类型错误表示您已尝试将运算符/应用于两个字符串。 python中没有为str类型定义这样的运算符,因此您应该将数据转换为某种数字类型,以您的情况为float

我不十分了解您的数据的样子。但是如果是这样的话:

df
Out:
Date                   Quantity    Total Value (Lacs) 
2018-04-16 00:00:00    8317.000             259962.50  
2018-04-17 00:00:00    7823.000             234004.50                                

您可以将其转换为数字类型,将所有列转换为正确的类型(我想Date列是索引列):

df_float = df.apply(pd.to_numeric)
df_float.dtypes()
Out: 
Quantity              float64
Total Value (Lacs)      int64
dtype: object

毕竟,您只能处理列:

df['Price'] =  (df_float['Total Value (Lacs)'] * 100000 
                / df_float['Quantity'] * 100)
df['Price']
Out: 
2018-04-16 00:00:00    319930.7592441217
2018-04-17 00:00:00    334309.8102814262

另一种方法是定义函数,并使用pd.DataFrame.apply将其应用于每一行:

def get_price(row):
    try:
        price = (float(row['Total Value (Lacs)']) * 100000 
                 / float(row['Quantity']) * 100)
    except (TypeError, ValueError):  # If bad data in this row, can't convert to float
        price = None
    return price

df['Price'] =  df.apply(get_price, axis=1)
df['Price']
Out: 
2018-04-16 00:00:00    319930.7592441217
2018-04-17 00:00:00    334309.8102814262

axis=1的意思是“每行都适当”

如果已转置数据-如您的示例,则应转置数据或使用axis=0将函数应用于每一列。

Eidt 2 : 看起来您的数据只是单列,并且具有dtype pd.Series。因此,如果选择带有data['Quantity']的行,则会得到8317.000类型的str之类的东西。当然,没有pd.Series.apply方法。因此,在这种情况下,您可以采取以下方式:

index_to_convert = ['Quantity', 'Total Value (Lacs)']
data[index_to_convert] = pd.to_numeric(data[index_to_convert])
  • ,仅数字列被转换。只需执行以下公式即可:

    data ['Price'] =(data ['Total Value(Lacs)'] * 100000                 / data ['Quantity'] * 100) 数据 出: 日期2018-04-16 00:00:00 数量8317 总价值(法币)259962 价格3.12568e + 08

但是在大​​多数情况下,此解决方案不太方便,我强烈建议您将数据转换为DataFrame并加以处理,因为DataFrame提供了更大的灵活性和功能。 转换过程:

df = data.to_frame().T.set_index('Date')

有三个连续的动作:

  1. 将您的数据转换为DataFrame
  2. 将其转置为(现在列实际上是垂直的)
  3. "Date"设置为索引列

结果:

df 
Out: 
                    Quantity Total Value (Lacs)
Date                                           
2018-04-16 00:00:00  8317.00          259962.50

完成上述步骤后,您可以将 Edit 1 代码应用于您的数据。同样适用于您的数据中不止一个系列。

更多: 如果您的数据每个索引具有多个值,即多个数量集:

data
Out: 
Date                  2018-04-16 00:00:00
Quantity                          8317.00
Total Value (Lacs)              259962.50
Date                  2018-04-17 00:00:00
Quantity                          6434.00
Total Value (Lacs)              230002.50

您还可以逐步将其转换为pd.DataFrame。 通过索引条目对数据进行分组,并将list应用于组:

data.groupby(level=0).apply(list)
Out: 
Date                  [2018-04-16 00:00:00, 2018-04-17 00:00:00]
Quantity                                      [8317.00, 6434.00]
Total Value (Lacs)                        [259962.50, 230002.50]

然后将pd.Series应用于每一行:

data.groupby(level=0).apply(list).apply(pd.Series)
Out:                                  0                    1
Date                2018-04-16 00:00:00  2018-04-17 00:00:00
Quantity                        8317.00              6434.00
Total Value (Lacs)            259962.50            230002.50

转置返回的DataFrame,将“日期”列设置为索引:

series.groupby(level=0).apply(list).apply(pd.Series).T.set_index('Date')
Out:
                    Quantity Total Value (Lacs)
Date                                           
2018-04-16 00:00:00  8317.00          259962.50
2018-04-17 00:00:00  6434.00          230002.50

编辑1 应用解决方案。 希望能帮助到你!