猿问

Pandas - 拆分列并包含计数

我有以下数据框:


            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的程序- 从列值创建列,并用计数填充


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


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 和分类时会发生这种情况,但我想知道为什么它似乎在原始帖子中起作用。我该如何解决这个问题?任何人都可以帮忙吗?谢谢!


 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


摇曳的蔷薇
浏览 197回答 2
2回答

忽然笑

你可以GroupBy在doc_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  fulltext0     dok:1           0.0       3.01  dok:1020           1.0       4.02   dok:103           0.0       1.03  dok:1030           1.0       0.04  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_fulltext0               dok:1         0             31            dok:1020         1             42             dok:103         0             13            dok:1030         1             04            dok:1038         0             1

红颜莎娜

我不知道这是否是最好的方法,但这应该适合你:import pandas as pddf = pd.DataFrame({"doc_id":["id1", "id2", "id1", "id2"],                    "is_fulltext":[1, 0, 1, 1]})df_grouped = df.groupby("doc_id").sum().reset_index()df_grouped["non_fulltext"] = df.groupby("doc_id").count().reset_index()["is_fulltext"] - df_grouped["is_fulltext"]df_grouped 输出是:  doc_id  is_fulltext  non_fulltext0    id1            2             01    id2            1             1
随时随地看视频慕课网APP

相关分类

Python
我要回答