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 列:
- New1 = 每个 ID 状态为“活动”的协议数量
- New2 = 每个 ID 具有缺失状态 (np.nan) 的协议数量
- 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
您好!我有如下所示的 DataFrame:
df = pd.DataFrame({"ID": ["1", "2", "1", "3", "2", "2"],
"status" : ["active", "active", np.nan, "notactive", "other", "other"]})
我需要计算新的 DataFrame 列:
- New1 = 每个 ID 状态为“活动”的协议数量
- New2 = 每个 ID 具有缺失状态 (np.nan) 的协议数量
- 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