我有一个pandas框架,它的数据结构如下:
的数据我想创建一个新的自定义计数器列,按用户和代码列分组。目的是如果action为“OUT”则递增,如果“IN”则递减。它不应该有负数,因为假设“OUT”的出现次数总是>=“IN”的出现次数。这就是我想要实现的,我已经尝试了groupby和transform,但没有成功。
groupby
transform
的任何建议将不胜感激。
ru9i0ody1#
您可以创建一个新列,将Action列转换为整数值,然后在新列上使用cumsum:
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列中没有负值,你可以这样做:
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
型
rvpgvaaj2#
对于SQL,首先为“OUT”添加一列“flag”1,为“IN”添加-1,然后对“flag”进行累积求和。对于Python,使用numpy Series来做应该会更快。
2条答案
按热度按时间ru9i0ody1#
您可以创建一个新列,将Action列转换为整数值,然后在新列上使用
cumsum
:字符串
正如mozway指出的,
cumsum
不关心负值。如果你想确保Instances
列中没有负值,你可以这样做:型
rvpgvaaj2#
对于SQL,首先为“OUT”添加一列“flag”1,为“IN”添加-1,然后对“flag”进行累积求和。
对于Python,使用numpy Series来做应该会更快。