如何根据条件过滤,汇总和重塑数据框

时间:2019-07-08 04:40:02

标签: python python-3.x pandas dataframe

我有以下数据框

df=pd.DataFrame({'column1_T1':[1,0,0,1,1],'column1_issues':     ['Comment1','abc','pqr','Comment2','Comment1'],'column2_T2':[0,0,1,0,1],'column2_issues':['OK','abc','Comment3','efg','Comment3']}) 

如下所示 df

column1_T1  column1_issues  column2_T2    column2_issues
1                Comment1    0                 OK
0                  abc       0                 abc
0                  pqr       1                 Comment3
1              Comment2      0                 efg
1              Comment1      1                 Comment3

后缀为T1,T2等的列包含1或0。

后缀为“问题”的列包含有关相应问题的注释。 我只需要在后缀为T1 / T2的列中考虑1,以此类推,而在column1_issues,column2_issues等中则考虑相应的问题。

现在我想计算column1_T1,column2_T2中的1的数目,以及column1_issues,column2_issues中分别对应于column1_T1,column2_T2中的1的唯一注释,并以以下格式获取

column_labels     count   issue1     issue2
column1_issues     3      comment1   commen2
column2_issues     2      comment3

我尝试了groupby和crosstab,但是我无法获得

df3=df.groupby(['column1_T1', 'column1_issues'])['column1_T1'].count().unstack().fillna(0)

df3['Total'] =df3.loc[[1]].sum(axis=1)

但这远不是我想要的。我真的被困在这里。

我希望我的最终数据框具有上述格式 格式如下

column_labels     count   issue1     issue2
column1_issues     3      comment1   commen2
column2_issues     2      comment3

1 个答案:

答案 0 :(得分:2)

为每个组的1值首先过滤第一列,为2列DataFrame获得第二列:

df1 = pd.concat([x.iloc[x.iloc[:, 0].values == 1,1].to_frame('issues').assign(lab=x.columns[1])
               for i, x in df.groupby(lambda x: x.split('_')[0], axis=1)], ignore_index=True)
print (df1)
     issues             lab
0  Comment1  column1_issues
1  Comment2  column1_issues
2  Comment1  column1_issues
3  Comment3  column2_issues
4  Comment3  column2_issues

然后删除重复项,在GroupBy.cumcount处添加帮助列,并在DataFrame.pivot处进行整形,最后在DataFrame.insert处将Series.value_counts用于计数列:

df2 = df1.drop_duplicates().copy()
df2['g'] = df1.groupby('lab').cumcount().add(1)
df2 = df2.pivot('lab','g','issues').add_prefix('issue')
df2.insert(0, 'count', df1['lab'].value_counts())

df2 = df2.reset_index().rename_axis(None, axis=1)
print (df2)
              lab  count    issue1    issue2
0  column1_issues      3  Comment1  Comment2
1  column2_issues      2  Comment3       NaN