Я пытаюсь преобразовать объект pandas DataFrame в новый объект, который содержит классификацию точек на основе некоторых простых порогов:
- Значение преобразуется в
0
, если точкаNaN
- Значение преобразуется в
1
, если точка отрицательная или равна 0 - Значение преобразуется в
2
, если оно не соответствует определенным критериям на основе всего столбца. - Значение
3
в противном случае
Вот очень простой автономный пример:
import pandas as pd
import numpy as np
df=pd.DataFrame({'a':[np.nan,1000000,3,4,5,0,-7,9,10],'b':[2,3,-4,5,6,1000000,7,9,np.nan]})
print(df)
Процесс преобразования, созданный до сих пор:
#Loop through and find points greater than the mean -- in this simple example, these are the 'outliers'
outliers = pd.DataFrame()
for datapoint in df.columns:
tempser = pd.DataFrame(df[datapoint][np.abs(df[datapoint]) > (df[datapoint].mean())])
outliers = pd.merge(outliers, tempser, right_index=True, left_index=True, how='outer')
outliers[outliers.isnull() == False] = 2
#Classify everything else as "3"
df[df > 0] = 3
#Classify negative and zero points as a "1"
df[df <= 0] = 1
#Update with the outliers
df.update(outliers)
#Everything else is a "0"
df.fillna(value=0, inplace=True)
В результате чего:
Я пытался использовать .applymap()
и/ или .groupby()
, чтобы ускорить процесс, если не повезло. Я нашел некоторые рекомендации в этом ответе, однако я все еще не уверен, насколько полезен .groupby()
, когда вы не группируете внутри колонка панд.