Итерация по строкам панд - PullRequest
0 голосов
/ 24 октября 2018

Имея df:

cell;value
0;8
1;2
2;1
3;6
4;4
5;6
6;7

И я пытаюсь определить функцию, которая будет проверять значения ячеек строки после наблюдаемой.Если значение ячейки после наблюдаемой (i+1) больше, чем наблюдаемое (i), то значения в новом столбце maxValue равны 0, если меньше - 1.

Окончательнаяdf должно выглядеть так:

 cell;value;maxValue
    0;8;1
    1;2;1
    2;1;0
    3;6;1
    4;4;0
    5;6;0
    6;7;0

Мое решение, которое еще не работает:

    def MaxFind(df, a, col='value'):
if df.iloc[a+1][col] > df.iloc[a][col]:
    return 0

df['maxValue'] = df.apply(lambda row: MaxFind(df, row.value), axis=1)

1 Ответ

0 голосов
/ 24 октября 2018

Я полагаю, вам нужно shift со сравнением по gt, инвертирующей маской и приведением к целым числам:

df['maxValue'] = (~df['value'].shift().gt(df['value'])).astype(int)
#another solution
#df['maxValue'] = df['value'].shift().le(df['value']).astype(int)
print (df)
   cell  value  maxValue
0     0      8         1
1     1      2         0
2     2      1         0
3     3      6         1
4     4      4         0
5     5      6         1
6     6      7         1

Подробности:

df['shifted'] = df['value'].shift()
df['mask'] = (df['value'].shift().gt(df['value']))
df['inverted_mask'] = (~df['value'].shift().gt(df['value']))
df['maxValue'] = (~df['value'].shift().gt(df['value'])).astype(int)
print (df)
   cell  value  shifted   mask  inverted_mask  maxValue
0     0      8      NaN  False           True         1
1     1      2      8.0   True          False         0
2     2      1      2.0   True          False         0
3     3      6      1.0  False           True         1
4     4      4      6.0   True          False         0
5     5      6      4.0  False           True         1
6     6      7      6.0  False           True         1

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

df['maxValue'] = df['value'].shift(1).le(df['value'].shift(-1)).astype(int)

print (df)
   cell  value  maxValue
0     0      8         0
1     1      2         0
2     2      1         1
3     3      6         1
4     4      4         1
5     5      6         1
6     6      7         0

df['shift_1'] = df['value'].shift(1)
df['shift_-1'] = df['value'].shift(-1)
df['mask'] = df['value'].shift(1).le(df['value'].shift(-1))
df['maxValue'] = df['value'].shift(1).le(df['value'].shift(-1)).astype(int)

print (df)
   cell  value  shift_1  shift_-1   mask  maxValue
0     0      8      NaN       2.0  False         0
1     1      2      8.0       1.0  False         0
2     2      1      2.0       6.0   True         1
3     3      6      1.0       4.0   True         1
4     4      4      6.0       6.0   True         1
5     5      6      4.0       7.0   True         1
6     6      7      6.0       NaN  False         0

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

df['shift_1'] = df['value'].shift(2)
df['shift_-1'] = df['value'].shift(-2)
df['mask'] = df['value'].shift(2).le(df['value'].shift(-2))
df['maxValue'] = df['value'].shift(2).le(df['value'].shift(-2)).astype(int)
print (df)
   cell  value  shift_1  shift_-1   mask  maxValue
0     0      8      NaN       1.0  False         0
1     1      2      NaN       6.0  False         0
2     2      1      8.0       4.0  False         0
3     3      6      2.0       6.0   True         1
4     4      4      1.0       7.0   True         1
5     5      6      6.0       NaN  False         0
6     6      7      4.0       NaN  False         0

df['shift_1'] = df['value'].shift(2).bfill()
df['shift_-1'] = df['value'].shift(-2).ffill()
df['mask'] = df['value'].shift(2).bfill().le(df['value'].shift(-2).ffill())
df['maxValue'] = df['value'].shift(2).bfill().le(df['value'].shift(-2).ffill()).astype(int)

print (df)
   cell  value  shift_1  shift_-1   mask  maxValue
0     0      8      8.0       1.0  False         0
1     1      2      8.0       6.0  False         0
2     2      1      8.0       4.0  False         0
3     3      6      2.0       6.0   True         1
4     4      4      1.0       7.0   True         1
5     5      6      6.0       7.0   True         1
6     6      7      4.0       7.0   True         1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...