1.输入:我的数据帧在名称中包含a和b值
ID name
1 a1/x,b1
2 a1,a2v,a3,d12,L2c,f13/w
3 a5,a6,C3,b2/y
4 a8/g,b9/p
2.预期输出_1:我想删除所有包含超过1 a和1 b值的名称
ID name
1 a1/x,b1
4 a8/g,b9/p
3.预期输出_2:我希望将多个名称值拆分为单个a和b值,如下所示
ID name
1 a1/x,b1
2 a1,d12
3 a2v,L2c
4 a3,f13/w
5 a5,C3
6 a6,b2/y
7 a8/g,b9/p
我之前把数据放在[[a1,a2],[b1,b3]]中,这是一种列表形式,然后去掉括号,按照输入取数据。
我尝试过的代码
Output_2代码:df["名称"]=df["姓名"].str.split(","(explode((.agg(",&;.join((df
但它不起作用,我还没有为output_1找到代码。
对于输出1:
df = df[~df["name"].apply(lambda x: x.count("a") > 1 and x.count("b") > 1)]
print(df)
打印:
ID name
0 1 a1,b1
3 4 a8,b9
对于输出2:
def fn(x):
l = x.split(",")
a = [v for v in l if v.startswith("a")]
b = [v for v in l if v.startswith("b")]
return list(map(list, zip(a, b)))
df["name"] = df["name"].apply(fn)
df = df.explode("name").reset_index(drop=True)
df["name"] = df["name"].apply(",".join)
df["ID"] = df.index + 1
print(df)
打印:
ID name
0 1 a1,b1
1 2 a1,b1
2 3 a2,b2
3 4 a3,b3
4 5 a5,b3
5 6 a6,b2
6 7 a8,b9
编辑:具有更新的输入数据:
输出1:
df = df[~df["name"].apply(lambda x: x.count("a") > 1 or x.count("b") > 1)]
print(df)
ID name
0 1 a1/x,b1
3 4 a8/g,b9/p
输出2:
def fn(x):
l = x.split(",")
a = [v for v in l if v.startswith("a")]
b = [v for v in l if not v.startswith("a")]
return list(map(list, zip(a, b)))
df["name"] = df["name"].apply(fn)
df = df.explode("name").reset_index(drop=True)
df["name"] = df["name"].apply(",".join)
df["ID"] = df.index + 1
print(df)
ID name
0 1 a1/x,b1
1 2 a1,d12
2 3 a2v,L2c
3 4 a3,f13/w
4 5 a5,C3
5 6 a6,b2/y
6 7 a8/g,b9/p