根据另一列中先前行的值确定Pandas数据框中的值

daupos2t  于 2023-01-11  发布在  其他
关注(0)|答案(1)|浏览(101)

我有一个数据集,看起来像这样:
| 姓名|日期|现况|
| - ------|- ------|- ------|
| 约翰|二○二二年十一月一日|是的|
| 简|二○二二年十一月一日|没有|
| 艾米丽|二○二二年十一月二日|没有|
| 约翰|二○二二年十一月二日|没有|
| 艾米丽|二〇二二年十一月三日|是的|
| 简|二〇二二年十一月三日|没有|
| 艾米丽|2022年11月4日|没有|
我想检查并计算按日期顺序Status为“Yes”的名称。因此,如果Name在前一个日期(或行,因为数据已按日期升序排序)为Status“Yes”,则将其计为1。
我读过关于pandas.dataframe.shiftpandas.dataframe.isinpandas.dataframe.equals的内容,但我不认为这是我想要检查前一行值的函数。

预期输出为:

2(约翰、艾米丽)
任何人都可以帮助我建立的代码吗?谢谢你提前。

3zwtqj6y

3zwtqj6y1#

您可以使用groupby()-〉transform()来处理按每个人分组的记录块。按日期对记录进行排序,并检查前一个日期的状态是否为“是”。收集所有带有肯定检查标志的结果。
在每行之前添加注解以解释逻辑。

# For each "Name", check if previous date has status "Yes".
def check_prev_date_status(g):
    df_g = g.apply(pd.Series)

    # Sort by date.
    df_g = df_g.sort_values(0)

    # Check if last but one status is "Yes".
    if df_g[-2:-1][1].values[0] == "Yes":
      return 1
    else:
      return 0

# Compute tuple of "Date" and "Status" for easy processing as one column. It is hard to process multiple columns with "transform()".
df["Date_Status"] = df[["Date", "Status"]].apply(tuple, axis=1)

# Apply above function and compute flag if previous date has status "Yes".
df["check_status_flag"] = df.groupby("Name")[["Date_Status"]].transform(check_prev_date_status)

# Filter and count the results.
print(df[df["check_status_flag"] == 1]["Name"].unique())

输出:

['John' 'Emily']

相关问题