熊猫-拆分列并包含计数

我有以下数据框:

            doc_id  is_fulltext
1243      dok:1            1
3310      dok:1            1
4370      dok:1            1
14403  dok:1020            1
17252  dok:1020            1
15977  dok:1020            0
16480  dok:1020            1
16252  dok:1020            1
468     dok:103            1
128    dok:1030            0
1673   dok:1038            1

我想将is_fulltext列分为两列,并同时计算文档的出现次数。

所需输出:

 doc_id                 fulltext  non-fulltext
0           dok:1        3          0
1           dok:1020     4          1
2           dok:103      1          0
3           dok:1030     0          1
4           dok:1038     1          0


我遵循了Pandas的过程-从列值创建列,并用count填充

该帖子显示了几种选择,建议分类或重新索引。我尝试了以下方法:

cats = ['fulltext', 'non_fulltext']
df_sorted['is_fulltext'] = pd.Categorical(df_sorted['is_fulltext'], categories=cats)
new_df = df_sorted.groupby(['doc_id', 'is_fulltext']).size().unstack(fill_value=0)

在这里,我得到一个ValueError:

ValueError: Length of passed values is 17446, index implies 0

然后我尝试了这种方法


cats = ['fulltext', 'non_fulltext']
new_df = df_sorted.groupby(['doc_id','is_fulltext']).size().unstack(fill_value=0).reindex(columns=cats).reset_index()

虽然这在原始帖子中似乎工作得很好,但我的数量充满了NAN(请参见下文)。我现在读到,在使用reindex和categorical时会发生这种情况,但我想知道为什么它似乎在原始文章中起作用了。我该如何解决呢?有人可以帮忙吗?谢谢!

 doc_id                         fulltext  non-fulltext
0           dok:1                NaN          NaN
1           dok:1020             NaN          NaN
2           dok:103              NaN          NaN
3           dok:1030             NaN          NaN
4           dok:1038             NaN          NaN

亚图

您可以GroupBydoc_id,应用于pd.value_counts每个组并unstack

(df.groupby('doc_id').is_fulltext.apply(pd.value_counts)
                                 .unstack()
                                 .fillna(0)
                                 .rename(columns={0:'non-fulltext', 1:'fulltext'})
                                 .reset_index())

    doc_id      non-fulltext  fulltext
0     dok:1           0.0       3.0
1  dok:1020           1.0       4.0
2   dok:103           0.0       1.0
3  dok:1030           1.0       0.0
4  dok:1038           0.0       1.0

或类似于您自己的方法,如果性能存在问题,请改用:

df.groupby(['doc_id','is_fulltext']).size()
                                    .unstack(fill_value=0)
                                    .rename(columns={0:'fulltext',1:'non_fulltext'})
                                    .reset_index()

is_fulltext    doc_id  fulltext  non_fulltext
0               dok:1         0             3
1            dok:1020         1             4
2             dok:103         0             1
3            dok:1030         1             0
4            dok:1038         0             1

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章