2014-02-21 2 views
1

Я хотел бы получить таблицу со значениями после каждой ячейки = 100 в таблице. Есть ли эффективный метод для этого?Python: извлекать значения после индекса в каждом столбце таблицы

Сейчас:

Col1 Col2 Col3 Col4 
1 89 100 92 
2 100 14 88 
3 75 18 100 
4 34 56 63 

To:

Col1 Col2 Col3 Col4 
1 nan 100 nan 
2 100 14 nan 
3 75 18 100 
4 34 56 63 

Я пробовал:

for row in data: 
    empty.append(str(np.where(element == 100 for element in row))); 
for i in empty: 
    #Not sure what to do next 

ответ

2

Векторизованного подход к вашей проблеме:

>>> a = np.array([[89, 100, 92], [100, 14, 88], 
...    [75, 18, 100], [34, 56, 63]]) 
>>> first100 = np.argmax(a == 100, axis=0) 
>>> first100 
array([1, 0, 2], dtype=int64) 
>>> mask = rows[:, None] < first100 
>>> mask 
array([[ True, False, True], 
     [False, False, True], 
     [False, False, False], 
     [False, False, False]], dtype=bool) 
>>> out = a.astype(float) 
>>> out[mask] = np.nan 
>>> out 
array([[ nan, 100., nan], 
     [ 100., 14., nan], 
     [ 75., 18., 100.], 
     [ 34., 56., 63.]]) 
+0

Что такое переменные строки? – Black

+0

Не видел вас какое-то время, но это решительное решение! Немного странно, что 'numpy' не имеет встроенного' cummax', такого как 'R'. –

+1

'rows = np.array ([0,1,2,3])' –

1

Похоже, вы используете pandas, но если вы не будете, вероятно, требуется кумулятивная максимальная функция:

In [37]: 

a 
Out[37]: 
array([[ 89, 100, 92], 
     [100, 14, 88], 
     [ 75, 18, 100], 
     [ 34, 56, 63]], dtype=int64) 
In [38]: 

def cummax(a): 
    result=[] 
    for i in range(len(a)): 
     if i==0: 
      result.append(a[0]) 
     else: 
      result.append(max(a[:i+1])) 
    return np.array(result) 
In [39]: 

np.where(np.apply_along_axis(cummax, 0, a)>=100, a, np.nan) 
Out[39]: 
array([[ nan, 100., nan], 
     [ 100., 14., nan], 
     [ 75., 18., 100.], 
     [ 34., 56., 63.]]) 
+0

Игнорировать второй question.I'm с помощью NumPy. Должен ли я переносить свою матрицу после запуска кода, поскольку я хочу, чтобы столбцы были затронуты, что, по-видимому, является транспонированием вашего окончательного массива. – Black

+0

Нет, сэр, в этом случае просто измените его на 'np.apply_along_axis (cummax, 0, a)' (1-> 0). :) –

+0

Если у меня есть набор данных, как указано в открытии, функция реализована через: a = np.transpose (data); np.where (np.apply_along_axis (cummax (a), 0, a)> = 100, a, np.nan) – Black

Смежные вопросы