Pandas pivot表以替换字符串的多次命中

2024-09-30 22:17:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我用pandasmelt函数制作了一个表,看起来像

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

有什么建议吗

如果我的问题不清楚,请告诉我


Tags: 函数refindexsamtable矩阵v3class
2条回答

replaceregex=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

我将使用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']

也给出了相同的输出

相关问题 更多 >