我有一个flask应用程序,可以在其中获取数据并转换为pandas Dataframe。
if request.method == 'PUT':
content = request.get_json(silent=True)
df = pd.DataFrame.from_dict(content)
for index, row in df.iterrows():
if row["label"] == True:
row['A'] = row['B'] / row['C']
elif row["label"] == False:
row['A'] = row["B"]
if row['D'] == 0:
row['C'] = 0
else:
...
我想在这里做的是简单的算术运算,例如加法,减法和除法。
我之所以使用iterrows()主要是因为我需要多个值来迭代和执行特定行值的计算。 df['..'].item()
在我的用例中不起作用。
加减法工作正常,但除法似乎会以某种方式滑落,并且总是返回诸如0
,-1
,1
等值
示例计算
row['A'] = row['B'] / row['C']
大多数情况下,row['B']
的值小于row['C']
。值示例
row['A'] = 1232455 / 26719856
应用中涉及的唯一计算是加,减和除。
答案 0 :(得分:0)
您可以尝试一下(这里是一个示例):
import pandas as pd
import numpy as np
data = {'label': [True, False, True, True, False],
'A': [2012, 2012, 2013, 2014, 2014],
'B': [4, 24, 31, 21, 3],
'C': [25, 94, 57, 62, 70],
'D': [3645, 0, 27, 24, 96]}
df = pd.DataFrame(data)
您可以将更改直接应用于主数据框,而无需每次都这样遍历每一行:
# select only rows with label == True and apply the division function
df.loc[df.label == True, 'A'] = df['B']/df['C']
df.loc[df.label == False, 'A'] = df['B']
df.loc[np.logical_and(df.label == False, df.D == 0), 'C'] = 0
.
.
.
您可以每次选择要更改的行,然后直接在其中应用更改。就像我一样。
另一点:
在我的示例中应用除法后,整数被转换为float64,您可以尝试在示例中使用函数series.astype('flat64')
对于row['A'] = 1232455 / 26719856
,您将获得0.046125
,而不仅仅是整数部分0
。
也许每次进行除法操作都会使您免于置零