【问题标题】:Sum and aggreggation of columns in DataFrame in Python Pandas? [closed]Python Pandas中DataFrame中列的总和和聚合? [关闭]
【发布时间】:2021-04-14 15:24:43
【问题描述】:

你好!我有如下数据框:

df = pd.DataFrame({"ID": ["1", "2", "1", "3", "2", "2"],
                   "status" : ["active", "active", np.nan, "notactive", "other", "other"]})

我需要计算新的 DataFrame 女巫列:

  1. New1 = 每个 ID 状态为“活动”的协议数
  2. New2 = 每个 ID 缺少状态 (np.nan) 的协议数
  3. New3 = 每个 ID 状态为“未激活”或“其他”的协议数量 我需要的结果应该如下所示,但交叉表不起作用,因为 New3 列包含“nonactiv”和“other”状态:​​

【问题讨论】:

  • 你试过一些代码吗?告诉我们您是否尝试过,以及您坚持哪些事情......这不仅仅是“做我的家庭作业”。
  • 我试过 pd.crosstab(df['ID'], df['status']) 但它不起作用,因为它没有在 New3 “非活动”和“其他”中结合,它只每个状态分别计算
  • 那么不应该重述您的问题来询问如何将除np.nan'active' 之外的任何内容映射到另一个值?
  • Asish M 所以你认为将 NaN、nonactive 和其他替换为 2 statuset 我计算它?但是你能推荐一些代码吗?
  • 我投票结束这个问题,因为包含图形而不是可搜索文本中的问题。

标签: python pandas dataframe sum aggregation


【解决方案1】:

解决方案 1 - 您可以使用 factorize()NaN 值计为它们自己的组,而无需重新映射并帮助命名列(您所要做的就是使用 add_prefix()

df = (pd.crosstab(index=df['ID'], 
                  columns=df['status'].replace('other', 'notactive').fillna('active2')
                  .factorize()[0]+1)
        .add_prefix('New').reset_index())
df

Out[1]: 
col_0 ID  New1  New2  New3
0      1     1     1     0
1      2     1     0     2
2      3     0     0     1

解决方案 2: NaN 值将被排除在带有pd.crosstab 的列表中,因此您可以使用fillna()。您还必须根据您的条件使other 值等于notactive。现在,您可以使用crosstab 并获得您想要的结果。从那里,只需重命名列:

df = pd.crosstab(index=df['ID'], 
                 columns=df['status'].replace('other', 'notactive').fillna('active2'))
       .reset_index()
df.columns = ['ID', 'New1',  'New2', 'New3']
Out[2]: 
  ID  New1  New2  New3
0  1     1     1     0
1  2     1     0     2
2  3     0     0     1

【讨论】:

    猜你喜欢
    • 2021-04-06
    • 2019-09-03
    • 1970-01-01
    • 2021-04-14
    • 2021-10-02
    • 2020-01-28
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    相关资源
    最近更新 更多