Разделение строк при итерации в пандах с помощью iterrows - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть приложение-колба, в котором я получаю данные и преобразую их в панду 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

В приложении используются только вычисления, сложение, вычитание и деление.

1 Ответ

0 голосов
/ 27 февраля 2019

вы можете попробовать это (Вот пример):

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)

Вы можете применить свои изменения непосредственно к вашему основному Dataframe без необходимости повторять каждый ряд каждый раз, как это:

# 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.

Возможно, это избавит вас от появления нулей каждый раз, когда вы будете делить

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...