Заменить значения в столбце на NaN, основываясь на других значениях в этом же столбце - PullRequest
0 голосов
/ 05 февраля 2019

Это частный случай вопроса в заголовке.

У меня есть следующий фрейм данных:

values = [[100,54,25,26,32,33,15,2],[1,2,3,4,5,6,7,8]]
columns = ["numbers", "order"]
zipped = dict(zip(columns,values))
df = pd.DataFrame(zipped)
print(df)

   numbers  order
0      100      1
1       54      2
2       25      3
3       26      4
4       32      5
5       33      6
6       15      7
7        2      8

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

   numbers  order
0      100      1
1       54      2
2      NaN      3
3      NaN      4
4      NaN      5
5       33      6
6       15      7
7        2      8

Какой будет наилучший подход для его достижениябез прохождения цикла?

Обновление: Вероятно, лучший пример для начального DF и ожидаемых результатов (для добавления несмежных блоков значений для замены):

values = [[100,54,25,26,34,32,31,33,15,2],[1,2,3,4,5,6,7,8,9,10]]

   numbers  order
0      100      1
1       54      2
2       25      3
3       26      4
4       34      5
5       32      6
6       31      7
7       33      8
8       15      9
9        2     10

Результаты:

   numbers  order
0    100.0      1
1     54.0      2
2      NaN      3
3      NaN      4
4     34.0      5
5      NaN      6
6      NaN      7
7     33.0      8
8     15.0      9
9      2.0     10

Ответы [ 2 ]

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

Вы можете циклически просматривать значения ваших столбцов и проверять, превышает ли оно все элементы после:

arr = df['numbers'].values
df['numbers'] = [x if all(x > arr[n+1:]) else np.nan for n, x in enumerate(arr)]
df

Вывод:

   numbers  order
0    100.0      1
1     54.0      2
2      NaN      3
3      NaN      4
4      NaN      5
5     33.0      6
6     15.0      7
7      2.0      8
0 голосов
/ 05 февраля 2019

Я читаю это немного по-другому, если числа ниже, это означает, что их обратная константа выше:

In [11]: df.at[3, 'numbers'] = 24  # more illustrative example 

In [12]: df.numbers[::-1].cummax()[::-1]
Out[12]:
0    100
1     54
2     33
3     33
4     33
5     33
6     15
7      2
Name: numbers, dtype: int64

In [13]: df.loc[df.numbers < df.numbers[::-1].cummax()[::-1], 'numbers'] = np.nan

In [14]: df
Out[14]:
   numbers  order
0    100.0      1
1     54.0      2
2      NaN      3
3      NaN      4
4      NaN      5
5     33.0      6
6     15.0      7
7      2.0      8
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...