Панды: значение рассчитывается по группам из нескольких столбцов - PullRequest
0 голосов
/ 31 августа 2018

У меня есть фрейм данных Pandas, который я группирую по двум столбцам: ID и Item. Затем я сохраняю последние 5 вхождений в каждой группе (максимум) и, наконец, хотел бы рассчитать соотношение числа вхождений одного конкретного типа. В частности, я хотел бы рассчитать количество «U» для каждого ID- элемент делится на общее количество вхождений.

У меня проблемы с последним шагом - я не уверен, как получить из общего подсчета значений, приведенного ниже, к соотношению для каждой группы ID-Item. Любые советы будут высоко оценены - спасибо!

d={'ID':[1,1,1,1,1,2,2,2,2,2],'Item': ['box','box','ball','ball','box','box','box','ball','box','ball'],'Direction':['D','U','U','D','U','U','D','D','D','D']}
df=pd.DataFrame(data=d)

z=company_item['revision_arrow'].value_counts()

groups=df.groupby(['ID','Item'])
max_count=5
lastfive=groups.head(max_count).reset_index(drop=True)

#count_series=lastfive['Direction'].value_counts()
count_series=groups['Direction'].value_counts()

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Если вы хотите рассчитать только количество («U») для каждой группы идентификаторов, разделенной на все количество («U»), вы можете использовать apply с определенной вами функцией:

d={'ID':[1,1,1,1,1,2,2,2,2,2],'Item': ['box','box','ball','ball','box','box','box','ball','box','ball'],'Direction':['D','U','U','D','U','U','D','D','D','D']}
df=pd.DataFrame(data=d)


def func(df):
    return len(df[df.Direction == 'U'])

df.groupby('ID').apply(func) / len(df[df.Direction == 'U'])

Выход:

ID
1    0.75
2    0.25

Вы можете группировать по ID и пункту, если вам нужно.

0 голосов
/ 31 августа 2018

Когда вы используете value_counts, у вас есть возможность нормализовать результаты. Вы можете использовать этот параметр, а затем индексировать результирующий DataFrame, чтобы включить только строки U:

out = (df.groupby(['ID', 'Item'])
          .Direction.value_counts(normalize=True)
          .rename('ratio').reset_index())

out.loc[out.Direction.eq('U')]

   ID  Item Direction     ratio
1   1  ball         U  0.500000
2   1   box         U  0.666667
6   2   box         U  0.333333
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...