Ставьте оценки для данных на основе идентификатора - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть фрейм данных, который индексируется по дате, я пытаюсь предоставить оценки для каждого аккаунта на основе категории. Если это значение категории существует на дату индекса, этот фрейм данных будет выглядеть следующим образом.

     accountid category Smooth Hard Sharp Narrow
timestamp                                             
2018-03-29       101   Smooth    1  NaN   NaN    NaN
2018-03-29       102     Hard    NaN  1   NaN    NaN
2018-03-30       103   Narrow    NaN  NaN   NaN    1
2018-04-30       104    Sharp    NaN  NaN   1    NaN
2018-04-21       105   Narrow    NaN  NaN   NaN    1

Каков наилучший способ циклически перебирать кадры данных для каждого аккаунта и назначать баллы для каждой категории без стека.

Вот сценарий создания фрейма данных.

import pandas as pd
import datetime
idx = pd.date_range('02-28-2018', '04-29-2018')

df = pd.DataFrame(
    [[ '101', '2018-03-29', 'Smooth','NaN','NaN','NaN','NaN'], [
         '102', '2018-03-29', 'Hard','NaN','NaN','NaN','NaN'
    ], [ '103', '2018-03-30', 'Narrow','NaN','NaN','NaN','NaN'], [
         '104', '2018-04-30', 'Sharp','NaN','NaN','NaN','NaN'
    ], [ '105', '2018-04-21', 'Narrow','NaN','NaN','NaN','NaN']],
    columns=[ 'accountid', 'timestamp', 'category','Smooth','Hard','Sharp','Narrow'])

df['timestamp'] = pd.to_datetime(df['timestamp'])
df=df.set_index(['timestamp'])
print(df)

1 Ответ

0 голосов
/ 26 апреля 2018

Вы можете использовать str accessor с get_dummies:

df[['accountid','category']].assign(**df['category'].str.get_dummies())

Выход:

           accountid category  Hard  Narrow  Sharp  Smooth
timestamp                                                 
2018-03-29       101   Smooth     0       0      0       1
2018-03-29       102     Hard     1       0      0       0
2018-03-30       103   Narrow     0       1      0       0
2018-04-30       104    Sharp     0       0      1       0
2018-04-21       105   Narrow     0       1      0       0

И заменить 0 на nan,

df[['accountid','category']].assign(**df['category'].str.get_dummies())\
                            .replace(0,np.nan)

Выход:

           accountid category  Hard  Narrow  Sharp  Smooth
timestamp                                                 
2018-03-29       101   Smooth   NaN     NaN    NaN     1.0
2018-03-29       102     Hard   1.0     NaN    NaN     NaN
2018-03-30       103   Narrow   NaN     1.0    NaN     NaN
2018-04-30       104    Sharp   NaN     NaN    1.0     NaN
2018-04-21       105   Narrow   NaN     1.0    NaN     NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...