基于另一列的Pandas计数器列

gz5pxeao  于 4个月前  发布在  其他
关注(0)|答案(2)|浏览(34)

我有一个pandas框架,它的数据结构如下:


的数据
我想创建一个新的自定义计数器列,按用户和代码列分组。目的是如果action为“OUT”则递增,如果“IN”则递减。它不应该有负数,因为假设“OUT”的出现次数总是>=“IN”的出现次数。
这就是我想要实现的,我已经尝试了groupbytransform,但没有成功。



任何建议将不胜感激。

ru9i0ody

ru9i0ody1#

您可以创建一个新列,将Action列转换为整数值,然后在新列上使用cumsum

df["Action_as_integer"] = df.Action.replace({"OUT": 1, "IN": -1})
df["Instances"] = df.groupby(["User", "Code"]).Action_as_integer.cumsum()

字符串
正如mozway指出的,cumsum不关心负值。如果你想确保Instances列中没有负值,你可以这样做:

def annotate_df_with_instances(df: pd.DataFrame) -> pd.DataFrame:
    df["Action_as_integer"] = df.Action.replace({"OUT": 1, "IN": -1})
    df["Instances"] = df.groupby(["User", "Code"]).Action_as_integer.cumsum()
    if True in (df["Instances"].values < 0):
        raise ValueError("Encountered negative number of instances.")
    return df

rvpgvaaj

rvpgvaaj2#

对于SQL,首先为“OUT”添加一列“flag”1,为“IN”添加-1,然后对“flag”进行累积求和。
对于Python,使用numpy Series来做应该会更快。

相关问题