Python Pandas 中 DataFrame 中列的总和和聚合?

Sum and aggreggation of columns in DataFrame in Python Pandas?

您好!我有如下所示的 DataFrame:

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”状态:​​

解决方案 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

方案二: 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