Как правильно составить слой if для получения желаемых результатов? - PullRequest
0 голосов
/ 01 июня 2019

[введите описание изображения здесь]

ИЗОБРАЖЕНИЕ 2 (результаты) введите описание изображения здесь

2 Я работаю с манипулированием данными в csvs, используя python + pandas . Пример # s

PL T
0,569999695

0,960002899

1,729999542

1,590000153

1.450000763

1,530002594 1,530002594

1.770000458

0,890003204

0,490001678

1.11000061

1.340000153

2,390003204 2,390003204

2,470001221

2.760002136

3.200000763

2.880001068

2,479999542 2.479999542

3.100002289

* * 1,269996643 тысяча сорок-девять

1,269996643

1.590000153

2.13999939

Я использовал операторы if в прошлом, однако это очень специфический оператор, и я не могу понять, что синтаксис работает правильно.

Если вы посмотрите на код, я хочу, чтобы столбец 'T' вычислялся так в строке уже есть несколько чисел из предыдущего кода, а остальные пустые.

Работающий код будет гипотетически проходить по строкам в столбце t.

Первые строки в основном пустые, поэтому они пропускаются, пока не попадут в строку с номером. if(df['T'].iat[x-1] != "")

как только он попадет в строку с номером в нем, скрипт проверит логическое (если ячейка в строке рядом с ней больше, чем ячейка над ней) (если

df['PL'].iat[x] > df['PL'].iat[x-1]

Если это логическое значение истинно, оно напечатает следующую ячейку в столбце df['T'].iat[x] = df['PL'].iat[x] и если логическое значение ложно, то ячейка остается пустой

Я думаю, что реальная проблема в том, как он повторяется после этого шага. Прямо сейчас я думаю, что это возвращение и просто проверка последнего оператора if снова, но я хочу, чтобы он повторял их все для каждой строки.

Он должен прочитать столбец выше, чтобы увидеть, является ли он пустым или заполненным, а затем снова пройти через операторы if, печатая только число, когда все выполнены.

Я пробовал несколько соглашений, а также использование и / или заявления. Я просто не могу заставить его напечатать правильные результаты.




import pandas as pd
import csv

df=pd.read_csv(filename)

len1 = len(df)

for x in range(len3): 

       if (df['T'].iat[x-1] != ""):

                if(df['T'].iat[x] == ""):

                    if (df['PL'].iat[x] > df['PL'].iat[x-1]):  

                        df['T'].iat[x] = df['PL'].iat[x]

Код не отображает сообщения об ошибках, однако он не печатает правильные результаты. Пожалуйста, дайте мне знать, если я могу объяснить это лучше или у кого-нибудь есть какие-либо идеи. Спасибо!

Ответы [ 3 ]

0 голосов
/ 01 июня 2019

Ваш первый оператор if не пропускает строки, пока не найдет пустую ячейку - ваш второй оператор if делает это. Ваше первое if утверждение (я думаю) приведет к сбою при проверке самой первой строки.

Попробуйте удалить первый if. Если это не сработает, попробуйте удалить и другие if, и посмотрите, можете ли вы вообще установить какие-либо значения с помощью df['T'].iat[x] = df['PL'].iat[x] - возможно, у панд есть отдельный метод для установки значений, а не для их получения .

0 голосов
/ 01 июня 2019
df.loc[((df['T'] > df['T'].shift(-1)) & (df['T'] != df['PL'])), 'PL'] = df['T']

IIUC, это должно делать то, что вы хотите.

РЕДАКТИРОВАТЬ:

df.loc[(((df['T'].shift(-1).isnull())&(df['PL'].diff()>0))|(~df['T'].shift().isnull())) , 'T'] = df['PL']

Это работает для меня.Я не понимаю, почему в вашем примере почему 4.65 и 4.87 не заполнены.Они отвечают всем требованиям и заполняются в моем случае.

0 голосов
/ 01 июня 2019

Что такое дф? если df словарь, как объект из 2 элементов, T и PL, то len(df) вернет 2.

возможно, вы имели в виду len(df["T"]) или len(df["PL"])?

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