我试图在列中应用公式,但无法应用。
我有数据资料:
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发布于 2018-08-25 09:15:04
编辑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.8102814262axis=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])但是在大多数情况下,这个解决方案并不方便,我强烈建议将数据转换为DataFrame并处理它,因为DataFrame提供了更多的灵活性和с能力。С反转过程:
df = data.to_frame().T.set_index('Date')有三个连续的行动:
DataFrame"Date"设置为索引列结果:
df
Out:
Quantity Total Value (Lacs)
Date
2018-04-16 00:00:00 8317.00 259962.50在前面的步骤之后,您可以将编辑1代码应用于数据。而且,它也适用于您的数据中有多个系列。
One:如果您的数据对每个索引有多个值,即多个数量ets:
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.50Transpose返回DataFrame,将'Date‘列设置为索引:
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的解决方案。希望能帮上忙!
发布于 2018-08-25 05:45:08
您将得到此错误,因为从dataframe提取的数据是字符串,如您的错误中所示,您需要将该字符串转换为浮点数。
将数据转换为值而不是字符串。你可以通过以下方式实现这一目标:
values = df.values然后,您可以从这个数组中提取值。
或者,从dataframe提取数据后,使用以下方法将其转换为浮动:
b=float(df['Quantity'])发布于 2018-08-25 06:05:04
用这个:
df['price'] = ((df['Total Value (Lacs)'].apply(pd.to_numeric)) * 100000 / (df['Quantity'].apply(pd.to_numeric)) * 100)https://stackoverflow.com/questions/52014364
复制相似问题