将列中的字符串扩展到 Pandas 中的不同单独列
Expand a string from a column into different separate columns in Pandas
我有以下形式的 df:
id sid steps
A 1 step1
A 1 step1-step2
A 1 step1-step2-step3
这包含用户 A
如何在给定会话 (sid) 中浏览特定系列页面(步骤)的数据。我想采取这些破折号分隔的步骤并为每个步骤创建单独的列。
结果:
id sid steps page_step1 page_step2 page_step3
A 1 step1 step1 NA NA
A 1 step1-step2 step1 step2 NA
A 1 step1-step2-step3 step1 step2 step3
我不知道具体有多少步骤,所以我希望它们是动态创建的。整个星期都坚持这个,谢谢!
使用str.split
:
>>> df.join(df["steps"].str.split("-",expand=True).add_prefix("page_step"))
id sid steps page_step0 page_step1 page_step2
0 A 1 step1 step1 None None
1 A 1 step1-step2 step1 step2 None
2 A 1 step1-step2-step3 step1 step2 step3
如果编号必须从1开始而不是0:
steps = df["steps"].str.split("-",expand=True)
output = df.join(steps.rename(columns={i: f"page_setup{i+1}" for i in steps.columns}))
>>> output
id sid steps page_setup1 page_setup2 page_setup3
0 A 1 step1 step1 None None
1 A 1 step1-step2 step1 step2 None
2 A 1 step1-step2-step3 step1 step2 step3
我用了series.map。我无法将过滤器应用于地图,因此我在函数中使用了 if 并创建了 slice2 和 slice3 以从数据帧列表中提取值
txt="""id\tsid\tsteps
A\t1\tstep1
A\t1\tstep1-step2
A\t1\tstep1-step2-step3"""
df=pd.read_csv(io.StringIO(txt),sep='\t')
#print(df)
results=df['steps'].apply(lambda x: x.split('-'))
print(results.tolist())
def Slice2(x):
print(x)
if len(x)>=2:
return x[1]
return None
def Slice3(x):
print(x)
if len(x)>=3:
return x[2]
return None
df['page_step1']=results.map(lambda x: x[0])
df['page_step2']=results.map(Slice2)
df['page_step3']=results.map(Slice3)
print(df)
输出
id sid steps page_step1 page_step2 page_step3
0 A 1 step1 step1 None None
1 A 1 step1-step2 step1 step2 None
2 A 1 step1-step2-step3 step1 step2 step3
我有以下形式的 df:
id sid steps
A 1 step1
A 1 step1-step2
A 1 step1-step2-step3
这包含用户 A
如何在给定会话 (sid) 中浏览特定系列页面(步骤)的数据。我想采取这些破折号分隔的步骤并为每个步骤创建单独的列。
结果:
id sid steps page_step1 page_step2 page_step3
A 1 step1 step1 NA NA
A 1 step1-step2 step1 step2 NA
A 1 step1-step2-step3 step1 step2 step3
我不知道具体有多少步骤,所以我希望它们是动态创建的。整个星期都坚持这个,谢谢!
使用str.split
:
>>> df.join(df["steps"].str.split("-",expand=True).add_prefix("page_step"))
id sid steps page_step0 page_step1 page_step2
0 A 1 step1 step1 None None
1 A 1 step1-step2 step1 step2 None
2 A 1 step1-step2-step3 step1 step2 step3
如果编号必须从1开始而不是0:
steps = df["steps"].str.split("-",expand=True)
output = df.join(steps.rename(columns={i: f"page_setup{i+1}" for i in steps.columns}))
>>> output
id sid steps page_setup1 page_setup2 page_setup3
0 A 1 step1 step1 None None
1 A 1 step1-step2 step1 step2 None
2 A 1 step1-step2-step3 step1 step2 step3
我用了series.map。我无法将过滤器应用于地图,因此我在函数中使用了 if 并创建了 slice2 和 slice3 以从数据帧列表中提取值
txt="""id\tsid\tsteps
A\t1\tstep1
A\t1\tstep1-step2
A\t1\tstep1-step2-step3"""
df=pd.read_csv(io.StringIO(txt),sep='\t')
#print(df)
results=df['steps'].apply(lambda x: x.split('-'))
print(results.tolist())
def Slice2(x):
print(x)
if len(x)>=2:
return x[1]
return None
def Slice3(x):
print(x)
if len(x)>=3:
return x[2]
return None
df['page_step1']=results.map(lambda x: x[0])
df['page_step2']=results.map(Slice2)
df['page_step3']=results.map(Slice3)
print(df)
输出
id sid steps page_step1 page_step2 page_step3
0 A 1 step1 step1 None None
1 A 1 step1-step2 step1 step2 None
2 A 1 step1-step2-step3 step1 step2 step3