Сводная таблица Pandas для замены нескольких попаданий на строку - PullRequest
0 голосов
/ 24 сентября 2019

Я использовал функцию pandas melt, чтобы создать таблицу, которая выглядит почти как

ref   Class   Sam
A      v1      1
A      v2      1
A      v2      1
B      v1      1
C      v2      1
A      v1      2
B      v2      2
B      v3      2
C      v1      2

И я пытался создать матрицу, используя pivot_table функцию

melt.pivot_table(index='ref', columns='Sam', values='Class', aggfunc=lambda x: ';'.join(x.unique())).fillna('')

Что дает мне что-то вроде этого

      1        2
A   v1;v2     v1
B     v1     v2;v3
C     v2      v1

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

пример;

      1        2
A  MultiHit   v1
B     v1    MultiHit
C     v2      v1

Есть предложения?

Пожалуйста, дайте мне знать, если мой вопрос не был ясен.

Ответы [ 2 ]

0 голосов
/ 24 сентября 2019

Я бы использовал groupby и обновил бы там, где это необходимо, затем отменил стек:

# replace count with nunique if necessary
new_df = df.groupby(['ref','Sam'])['Class'].agg({'count','first'})
new_df.loc[new_df['count'].gt(1), 'first'] = 'MultiHit'

new_df['first'].unstack('Sam')

Вывод:

Sam         1         2
ref                    
A    MultiHit        v1
B          v1  MultiHit
C          v2        v1

Pivot можно использовать также без последующей отмены стека:

new_df = df.pivot_table(index='ref', 
                        columns='Sam',
                        values='Class', 
                        aggfunc=['count', 'first'])

new_df.loc[:,'first'] = np.where(new_df.loc[:,'count'].gt(1), 
                                 'MultiHist', 
                                 new_df.loc[:,'first'])

new_df.loc[:,'first']

также дает тот же вывод.

0 голосов
/ 24 сентября 2019

использовать replace с regex=True

df.pivot_table(index='ref', columns='Sam', values='Class', aggfunc=lambda x: ';'.join(x.unique())).fillna('').replace('(\w+;\w+|;\w+)+','MultiHit',regex=True)

Sam         1         2
ref                    
A    MultiHit        v1
B          v1  MultiHit
C          v2        v1
...