首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在大熊猫中应用配方

如何在大熊猫中应用配方
EN

Stack Overflow用户
提问于 2018-08-25 05:38:45
回答 3查看 9.2K关注 0票数 0

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

我有数据资料:

代码语言:javascript
复制
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]

我试过一些东西

代码语言:javascript
复制
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’

编辑

我尝试了以下代码:

代码语言:javascript
复制
df['Price'] = float((float(df['Total Value (Lacs)'])) * 100000 / float((df['Quantity'])) * 100)    

但是得到了错误的价值

代码语言:javascript
复制
price     312567632.6

期待

代码语言:javascript
复制
price     31256.76326
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-08-25 09:15:04

编辑1类型错误意味着您尝试将运算符/应用于两个字符串。在python中没有为str类型定义这样的操作符,因此您应该将数据转换为某种数值类型,在您的示例中为float

我不太明白你的数据是什么样子。但如果是这样的话

代码语言:javascript
复制
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列是索引列):

代码语言:javascript
复制
df_float = df.apply(pd.to_numeric)
df_float.dtypes()
Out: 
Quantity              float64
Total Value (Lacs)      int64
dtype: object

毕竟,您可以只处理列:

代码语言:javascript
复制
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将其应用于每一行。

代码语言:javascript
复制
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方法。因此,在这种情况下,你可以这样做:

代码语言:javascript
复制
index_to_convert = ['Quantity', 'Total Value (Lacs)']
data[index_to_convert] = pd.to_numeric(data[index_to_convert])
  • 并且只有数字列被转换。只要按公式做: 数据‘Price’=(数据‘总值(Lacs)’* 100000 / data' Quantity‘* 100)数据输出日期: 2018-04-16 00:00:00数量8317总价值(Lacs) 259962价格3.12568e+08

但是在大多数情况下,这个解决方案并不方便,我强烈建议将数据转换为DataFrame并处理它,因为DataFrame提供了更多的灵活性和с能力。С反转过程:

代码语言:javascript
复制
df = data.to_frame().T.set_index('Date')

有三个连续的行动:

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

结果:

代码语言:javascript
复制
df 
Out: 
                    Quantity Total Value (Lacs)
Date                                           
2018-04-16 00:00:00  8317.00          259962.50

在前面的步骤之后,您可以将编辑1代码应用于数据。而且,它也适用于您的数据中有多个系列。

One:如果您的数据对每个索引有多个值,即多个数量ets:

代码语言:javascript
复制
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应用于组:

代码语言:javascript
复制
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应用于每一行:

代码语言:javascript
复制
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

Transpose返回DataFrame,将'Date‘列设置为索引:

代码语言:javascript
复制
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的解决方案。希望能帮上忙!

票数 1
EN

Stack Overflow用户

发布于 2018-08-25 05:45:08

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

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

代码语言:javascript
复制
values = df.values

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

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

代码语言:javascript
复制
b=float(df['Quantity'])
票数 0
EN

Stack Overflow用户

发布于 2018-08-25 06:05:04

用这个:

代码语言:javascript
复制
df['price'] = ((df['Total Value (Lacs)'].apply(pd.to_numeric)) * 100000 / (df['Quantity'].apply(pd.to_numeric)) * 100)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52014364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档