为了账号安全,请及时绑定邮箱和手机立即绑定

Pandas - 拆分列并包含计数

Pandas - 拆分列并包含计数

摇曳的蔷薇 2021-12-17 16:56:21
我有以下数据框:            doc_id  is_fulltext1243      dok:1            13310      dok:1            14370      dok:1            114403  dok:1020            117252  dok:1020            115977  dok:1020            016480  dok:1020            116252  dok:1020            1468     dok:103            1128    dok:1030            01673   dok:1038            1我想将 is_fulltext 列分成两列并同时计算文档的出现次数。期望输出: doc_id                 fulltext  non-fulltext0           dok:1        3          01           dok:1020     4          12           dok:103      1          03           dok:1030     0          14           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-fulltext0           dok:1                NaN          NaN1           dok:1020             NaN          NaN2           dok:103              NaN          NaN3           dok:1030             NaN          NaN4           dok:1038             NaN          NaN
查看完整描述

2 回答

?
忽然笑

TA贡献1806条经验 获得超5个赞

你可以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  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


查看完整回答
反对 回复 2021-12-17
?
红颜莎娜

TA贡献1842条经验 获得超13个赞

我不知道这是否是最好的方法,但这应该适合你:


import pandas as pd

df = 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_fulltext

0    id1            2             0

1    id2            1             1


查看完整回答
反对 回复 2021-12-17
  • 2 回答
  • 0 关注
  • 195 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号