Ваш конструктор массива создает строку dtype:
In [73]: arr = np.array([("a",1,"x"),("b",2,"y"),("c",1,"z")])
In [74]: arr
Out[74]:
array([['a', '1', 'x'],
['b', '2', 'y'],
['c', '1', 'z']], dtype='<U1')
2-й столбец?
In [75]: arr[:,2]
Out[75]: array(['x', 'y', 'z'], dtype='<U1')
In [76]: arr[:,1]
Out[76]: array(['1', '2', '1'], dtype='<U1')
go для проверки по строке:
In [77]: arr[:,1]=="1"
Out[77]: array([ True, False, True])
Создайте новый массив с нужными строками:
In [78]: np.where(arr[:,1]=="1", "Wow","Dud")
Out[78]: array(['Wow', 'Dud', 'Wow'], dtype='<U3')
присоедините его к оригиналу создайте новый массив (это не на месте):
In [79]: np.column_stack((arr, Out[78]))
Out[79]:
array([['a', '1', 'x', 'Wow'],
['b', '2', 'y', 'Dud'],
['c', '1', 'z', 'Wow']], dtype='<U3')
, но с pandas
In [80]: df = pd.DataFrame([("a",1,"x"),("b",2,"y"),("c",1,"z")], columns=['col1', 'col2', 'col3'
...: ])
In [81]: df
Out[81]:
col1 col2 col3
0 a 1 x
1 b 2 y
2 c 1 z
In [82]: df["newcol"] = np.where(df["col2"]==1, "Wow","Dud")
In [83]: df
Out[83]:
col1 col2 col3 newcol
0 a 1 x Wow
1 b 2 y Dud
2 c 1 z Wow
pandas
хранит свои данные в массивах, по одному на каждый кадр данных или по одному на серию (столбец). Переключение на numpy
автоматически не ускоряет процесс. Итерация строки в массиве так же медленна, как и строка apply
в кадре данных. Но, как я показываю здесь, операция с целым массивом часто может применяться ко всему фрейму данных. А добавить столбец в фрейм данных проще, чем добавить столбец в массив.