![](/img/trans.png)
[英]pandas column containing list of objects, split this column based upon keynames and store values as comma separated values
[英]Split a column which is separated by comma based on certain condition in pandas
我有一个 dataframe
df = pd.DataFrame([["A","a*k,x*k,z,c*m,r,s,f*f,e*d"], ["B","h*t,y,a,w*b,Z,c*b,i*t,f*f"]], columns=["id","c1"])
我想在以下条件下拆分以逗号分隔的列 c1:
示例:对于 c1 中的第一行,
预期 Output:
df_out = pd.DataFrame([["A","a*k,x*k,z,c*m,r,s,f*f,e*d","a,c,f","k,m,f"], ["B","h*t,y,a,w*b,Z,c*b,i*b,f*f","h,w,f","t,b,f"]], columns=["id","c1","c2","c3"])
怎么做?
您可以使用pd.Series.str.extractall
和GroupBy.apply
删除重复项并获取前 3 个字符串。
out = df["c1"].str.extractall(r"(.)\*(.)").groupby(level=0)
df[["c2", "c3"]] = out.apply(
lambda x: x.drop_duplicates(subset=1).head(3).agg(",".join)
)
# df
id c1 c2 c3
0 A a*k,x*k,z,c*m,r,s,f*f,e*d a,c,f k,m,f
1 B h*t,y,a,w*b,Z,c*b,i*t,f*f h,w,f t,b,f
首先定义一个 function 来生成 2 个新列:
def newCols(lst):
return pd.Series(filter(lambda tt: tt.find('*') >= 0, lst))\
.str.split('*', expand=True)\
.rename(columns={0: 'c2', 1: 'c3'})\
.drop_duplicates(subset='c3').iloc[:3]\
.apply(lambda col: ','.join(col))
然后生成结果为:
result = df.join(df.c1.str.split(',').apply(newCols))
结果是:
id c1 c2 c3
0 A a*k,x*k,z,c*m,r,s,f*f,e*d a,c,f k,m,f
1 B h*t,y,a,w*b,Z,c*b,i*t,f*f h,w,f t,b,f
newCols中的处理步骤
pd.Series(filter(lambda tt: tt.find('*') >= 0, lst))
- 从包含星号的元素创建一个系列。str.split('*', expand=True)
- 将其转换为 DataFrame。rename(columns={0: 'c2', 1: 'c3'})
- 将列重命名为'c2'和'c3' 。drop_duplicates(subset='c3')
- 删除重复的行(具有相同的c3 )。iloc[:3]
- 只取 3 个初始行。apply(lambda col: ','.join(col)
- 将每一列连接成一个字符串。尝试将它们作为“不断扩展的代码”执行,在:
lst = ['a*k', 'x*k', 'z', 'c*m', 'r', 's', 'f*f', 'e*d']
(来自第一个源行的结果)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.