使用iterrows在熊猫中迭代时划分行

时间:2019-02-27 08:56:25

标签: python pandas dataframe

我有一个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-11等值

示例计算

row['A'] = row['B'] / row['C']

大多数情况下,row['B']的值小于row['C']。值示例

row['A'] = 1232455 / 26719856

应用中涉及的唯一计算是加,减和除。

1 个答案:

答案 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

也许每次进行除法操作都会使您免于置零