我正在尝试在列中应用公式,但无法应用。
我在数据框中有数据:
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
答案 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')
有三个连续的动作:
DataFrame
"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 应用解决方案。 希望能帮助到你!