Сгруппировать и нормализовать выбранные столбцы Pandas DF - PullRequest
1 голос
/ 02 марта 2020

У меня есть образец DF, который я хочу нормализовать на основе 2 условий

Создание образца DF:

sample_df = pd.DataFrame(np.random.randint(1,20,size=(10, 3)), columns=list('ABC'))
sample_df["date"]= ["2020-02-01","2020-02-01","2020-02-01","2020-02-01","2020-02-01",
                "2020-02-02","2020-02-02","2020-02-02","2020-02-02","2020-02-02"]
sample_df["date"] = pd.to_datetime(sample_df["date"])
sample_df.set_index(sample_df["date"],inplace=True)
del sample_df["date"]
sample_df["A_cat"] = ["ind","sa","sa","sa","ind","ind","sa","sa","ind","sa"]
sample_df["B_cat"] = ["sa","ind","ind","sa","sa","sa","ind","sa","ind","sa"]
sample_df
print (sample_df)

OP:

            A    B   C  A_cat   B_cat
date                    
2020-02-01  14  11   7   ind    sa
2020-02-01  19  17   3   sa     ind
2020-02-01  19  6    3   sa     ind
2020-02-01  3   16   5   sa     sa
2020-02-01  12  6    16  ind    sa
2020-02-02  1   8    12  ind    sa
2020-02-02  10  13   19  sa     ind
2020-02-02  17  2    7   sa     sa
2020-02-02  9   13   17  ind    ind
2020-02-02  17  16   3   sa     sa

Условия для нормализации :

1. Groupby based on index, and
2. Nomalize selected columns

Например, если выбранные столбцы равны ["A","B"], в этом случае он должен сначала индексировать по группам в этом случае 2020-02-01 и нормализовать выбранные столбцы в 5 строках группы.

Другие входные данные:

selected_column = ["A","B"]

Я могу сделать это за for loop, перебирая группы и объединяя нормализованные значения. Поэтому любые предложения по более эффективному / pandas подходу были бы хороши.

Код, пробованный с Pandas:

from sklearn.preprocessing import StandardScaler
dfg = StandardScaler()
sample_df.groupby([sample_df.index.get_level_values(0)])[selected_columns].transform(dfg.fit_transform)     

Ошибка:

('Expected 2D array, got 1D array instead:\narray=[14. 19. 19.  3. 12.].\nReshape your data either using array.reshape(-1, 1) if your data has a single feature or array.reshape(1, -1) if it contains a single sample.', 'occurred at index A')

Ответы [ 2 ]

1 голос
/ 02 марта 2020

Это работает:

sample_df.groupby([sample_df.index.get_level_values(0)])[selected_column].transform(lambda x: (x-np.mean(x))/(np.std(x)))   
1 голос
/ 02 марта 2020

Надеюсь, я правильно понял ваш вопрос. Вы просто хотите сгруппировать по индексу, выбрать значения из A и B И РАССЧИТАТЬ ПРОЦЕНТ? 1005 *

В качестве альтернативы, после выбора A и B в кадре данных, отбросьте столбцы A и P и примените число значений pd.series

df2.drop(columns=['A','B'], inplace=True)
df2.apply(pd.Series.value_counts).transform(lambda x: x.div(x.sum()))
...