我有客户访问记录,他们来自哪个渠道.我希望每个客户都有一个记录,其中我有他们来自的第一个频道和他们来自的最后一个频道.

我需要补充的另一个逻辑是,如果第一个频道是"Direct",那么就不要拿它go 看下一个记录.如果下一个记录也是"直接",那么也不要拿它,而是看下一个记录.如果您为客户完成了所有记录,并且这些记录都是"直接"的,那么您可以将第一个频道设置为"直接". 对于最后一个频道,我需要同样的逻辑.获取频道,如果是"直接",则转到前一个频道.如果是"直接",则判断前一条记录,直到完成所有记录.

输入数据如下所示:

Customer ID Date Channel
1 1/1/24 Email
1 1/2/24 Search
1 1/3/24 Direct
2 1/5/24 Direct
2 1/6/24 Paid
2 1/7/24 Email
3 1/8/24 Direct
3 1/9/24 Direct
3 1/10/24 Direct
3 1/11/24 Direct

我需要的输出是这样的:

Customer ID First Channel Last Channel
1 Email Search
2 Paid Email
3 Direct Direct

如何在我的DataFrame中做到这一点?

可能我需要创建两个For循环,一个循环遍历所有记录,另一个循环遍历每个客户记录.它分配第一个通道,然后判断它是否是"Direct",然后转到下一个记录,直到循环结束.

推荐答案

  1. Date转换为DateTime,以便可以按Date排序(如果日期采用此格式,则使用format="%m/%d/%y").
  2. 定义condition_icondition_ii来解释你的新逻辑:你想保留for each 102:(i)如果所有行的Channel都是Direct,则保留all rows;或者(ii)如果所有行的Channel都是Direct,则保留only rows where 103 is 109 104.
  3. 分组为Customer ID,然后分别由firstlast相加.
  4. 合并由组比产生的帧.
df["Date"] = pd.to_datetime(df["Date"], format="%d/%m/%y")

df = df.sort_values(by="Date")

condition_i = df.groupby("Customer ID")["Channel"].transform(
    lambda x: all(x == "Direct")
)

condition_ii = (
    df.groupby("Customer ID")["Channel"]
    .transform(lambda x: any(x != "Direct"))
    .loc[df["Channel"] != "Direct"]
)

first = (
    df[(condition_i) | (condition_ii)]
    .groupby("Customer ID", as_index=False)
    .first()
    .rename(columns={"Channel": "Fist Channel"})
)

last = (
    df[(condition_i) | (condition_ii)]
    .groupby("Customer ID", as_index=False)
    .last()
    .rename(columns={"Channel": "Last Channel"})
)

out = pd.merge(
    first[["Customer ID", "Fist Channel"]], last[["Customer ID", "Last Channel"]]
)
   Customer ID Fist Channel Last Channel
0            1        Email       Search
1            2         Paid        Email
2            3       Direct       Direct

Python相关问答推荐

三个给定的坐标可以是矩形的点吗

Polars比较了两个预设-有没有方法在第一次不匹配时立即失败

Python daskValue错误:无法识别的区块管理器dask -必须是以下之一:[]

使用新的类型语法正确注释ParamSecdecorator (3.12)

需要计算60,000个坐标之间的距离

Pandas 有条件轮班操作

通过Selenium从页面获取所有H2元素

无法通过python-jira访问jira工作日志(log)中的 comments

' osmnx.shortest_track '返回有效源 node 和目标 node 的'无'

用Python解密Java加密文件

在Wayland上使用setCellWidget时,try 编辑QTable Widget中的单元格时,PyQt 6崩溃

当从Docker的--env-file参数读取Python中的环境变量时,每个\n都会添加一个\'.如何没有额外的?

Python,Fitting into a System of Equations

根据列值添加时区

从Windows Python脚本在WSL上运行Linux应用程序

如何使用OpenGL使球体遵循Python中的八样路径?

ConversationalRetrivalChain引发键错误

如何获取Python synsets列表的第一个内容?

我如何处理超类和子类的情况

如何在Python中画一个只能在对角线内裁剪的圆?