大家好,我的数据格式如下:
User touchpoint conversion
A C1 0
A C2 0
A C1 0
A C4 1
A C2 0
A C1 0
A C1 0
A C1 1
我能够使用以下代码创建序列:
df1 = df.groupby('User')[['touchpoint']].aggregate(lambda x: tuple(x)).reset_index()
df1['channel_path'] = df1['touchpoint'].apply(lambda x: '>'.join(x))
但是,当我遇到转换值1时,我想将序列分成子序列,例如:
sequence 1 : C1>C2>C1>C4
sequence 2: C2>C1>C1>C1
使用当前代码,我得到了整个序列:
C1>C2>C1>C4>C2>C1>C1>C1
任何有关这方面的指示都将有所帮助。谢谢。
答案 0 :(得分:0)
我用另一种方法做到了。由于您未指定断点,因此df1具有所有组合。
尝试一下。
l = [i for i in range(len(data)) if data['conversion'][i] == 1]
pointer = 0
for pos in l:
print('>'.join(data['touchpoint'][pointer:pos+1]))
pointer = pos+1
答案 1 :(得分:0)
尝试一下
df = pd.DataFrame({'User': ['A','A','A','A','B','B','B', 'B'],
'touchpoint': ['C1', 'C2', 'C1', 'C4', 'C2', 'C1', 'C1', 'C1'],
'conversion': [0,0,0,1,0,0,0,1]})
df1 = df.groupby(['User']).aggregate(lambda x: list(x))
df1 = df1.apply(lambda x: "".join([x[1][i] + '*' if value else x[1][i] + '>' for i, value in enumerate(x[0])]), axis = 1)
df1 = df1.apply(lambda x: x.split('*')[:-1])
您只需添加一个特殊字符,例如*
,以指示分割位置。
输出
User
A [C1>C2>C1>C4]
B [C2>C1>C1>C1]
dtype: object
这是一个索引为User
的系列对象