我有以下数据框
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
答案 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