Если ваш код не слишком тяжелый, чтобы вы могли использовать numpy
для повышения производительности, вы можете придерживаться pandas
объектов (DataFrame / Series) и поддерживать форму.
Например, возьмите этот пример df (который, я должен добавить, вы должны были предоставить с вашим вопросом):
df = pd.DataFrame(data=np.random.rand(7,3), columns=['a','b','c'])
df
a b c
0 0.382530 0.748674 0.186446
1 0.142991 0.965972 0.299884
2 0.568910 0.469341 0.896786
3 0.452816 0.021598 0.989637
4 0.884955 0.738519 0.082460
5 0.944797 0.103953 0.287005
6 0.379389 0.593280 0.832720
Чтобы создать объект с формой (7,1)
, вы можете использовать x = df[['a']]
, который представляет собой фрейм данных с одним столбцом (сравните с x=df['a']
, который является серией с формой (7,)
).
Теперь, если я перейду к массиву numpy с помощью y=x.values
, я все равно получу ту же самую форму (оба x и y имеют формы (7,1)).
Однако оба по-разному реагируют на логическое индексирование: вызов y[y>0.3]
вернет массив с формой (6,), тогда как вызов x[x>0.3]
вернет. .. датафрейм с формой (7,1). Давайте посмотрим:
массив:
y[y>0.3]
array([0.38252971, 0.56890993, 0.45281553, 0.88495521, 0.94479716,
0.37938899])
dataframe:
x[x>0.3]
a
0 0.382530
1 NaN
2 0.568910
3 0.452816
4 0.884955
5 0.944797
6 0.379389
Итак, чтобы получить серию с нужной вам формой (6,1), вы можно использовать
x[x['a']>0.3]
, который возвращает
a
0 0.382530
2 0.568910
3 0.452816
4 0.884955
5 0.944797
6 0.379389
И тогда, только после выполнения всех ваших манипуляций, вы можете вызвать .values
в конце при получении массива numpy с желаемым результатом.
Теперь, вообще говоря, манипуляции с массивами выполняются быстрее, чем с pandas объектами, но работать с pandas объектами проще, особенно если у вас много обработки данных.
Вы можете предпочесть работать с numpy полностью, но параметр pandas стоит знать, и, на мой взгляд, все проще и проще.
Надеюсь, это поможет!