Как обращаться к строке и столбцу при итерации по фрейму данных - PullRequest
1 голос
/ 12 мая 2019

Я перебираю большой массив данных, используя df.iterrows или df.itertuples.Я следую примеру, который был задан в следующей ссылке:

Вот [ссылка] ( Python Pandas перебирает строки и получает доступ к именам столбцов )


import numpy as np
import pandas as pd

df = pd.DataFrame(np.random.rand(10,4),columns=list('ABCD'))
print df
          A         B         C         D
0  0.351741  0.186022  0.238705  0.081457
1  0.950817  0.665594  0.671151  0.730102
2  0.727996  0.442725  0.658816  0.003515
3  0.155604  0.567044  0.943466  0.666576
4  0.056922  0.751562  0.135624  0.597252
5  0.577770  0.995546  0.984923  0.123392
6  0.121061  0.490894  0.134702  0.358296
7  0.895856  0.617628  0.722529  0.794110
8  0.611006  0.328815  0.395859  0.507364
9  0.616169  0.527488  0.186614  0.278792

На приведенном выше кадре данных я пытаюсь сделать ссылку на определенный столбец и строку (например, предыдущую строку), но получаю ошибки.Например:

for row in df.iterrows():
    if row.loc[1,'A'] > 0.95:
       temp_val = row.loc[0,'A']
    else: 
       temp_val = row.loc[0,'B']

Спасибо!

1 Ответ

1 голос
/ 12 мая 2019

Вы можете сделать это намного эффективнее, используя np.where и DataFrame.shift:

import numpy as np
np.where(df['A'].gt(0.95), df['A'].shift(), df['B'].shift())

Проблема с вашим кодом состоит в том, что df.iterrows() возвращает tuple, гдеПервый элемент - это индекс, а второй - Series, поэтому вы не можете напрямую его индексировать.Вот способ, которым вы могли бы сделать это:

df['result'] = np.nan
for ix, row in df.loc[1:,:].iterrows():
    if row.loc['A'] > 0.95:
        df.loc[ix, 'result'] = df.loc[ix-1,'A']
    else: 
        df.loc[ix, 'result'] = df.loc[ix-1,'B']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...