熊猫数据透视表以字符串替换多个匹配项

时间:2019-09-24 12:43:21

标签: python pandas pivot-table

我使用了熊猫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 :(得分:0)

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

答案 1 :(得分:0)

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

也可以使用枢轴,而无需以后拆卸:

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']

也给出相同的输出。