pandas iterrows () сравнивает только запись последнего результата во все строки - PullRequest
0 голосов
/ 14 октября 2019

Следующий код - , предполагается для итерации по фрейму данных и записи в столбец «Действительный». Это только запись последнего значения во все строки в «Действителен».

for index, row in lxrx.iterrows():
time_cur = (row['time'])
low_val = csvm.loc['LXRX', time_cur].low
price = (row['Price'])
if price > low_val:
    lxrx['Valid'] = price
else:
    lxrx['Valid'] = 'Invalid'

Для тестирования я использовал: print (цена) и печать (low_val)

это выводит то, что я ожидаю -каждая цена, затем каждая low_val:

3.13  2.8    2.1  3.06    3.36  3.06

Выводит нижний левый, а не нижний правый, как я хотел.

Index Valid     rather than     Index Valid
0     3.36                      0     3.13
1     3.36                      1     2.10
2     3.36                      2     3.36  

Я даже попытался вложить еще один цикл внутри этогочто я мог ссылаться на каждую строку в Valid, но это делало то же самое. Как я могу заставить его правильно написать каждое значение?

1 Ответ

2 голосов
/ 14 октября 2019

Ваша ошибка в следующих строках:

if price > low_val:
    lxrx['Valid'] = price
else:
    lxrx['Valid'] = 'Invalid'

Этот синтаксис применяет значение price или 'Неверный' ко всему столбцу.

Вместо этого используйте .loc для специального индексированиястрока / столбец, в который вы хотите ввести значение:

if price > low_val:
    lxrx.loc[index, 'Valid'] = price
else:
    lxrx.loc[index, 'Valid'] = 'Invalid'

Также, как уже упоминалось, этот цикл будет медленным решением того, что вы пытаетесь сделать, возможно, существует более простой векторизованный способ решения. проблема, объединяя младшие значения из csvm в lxrx в виде столбца, а затем делая что-то вроде:

lxrx["Valid"] = np.where(lxrx["Price"] > lxrx["low_value_from_csvm"], lxrx["Price"], "Invalid")

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