繁体   English   中英

根据 pandas 中的特定条件拆分以逗号分隔的列

[英]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:

  1. 只保留那些有 * 的字符串
  2. 如果在 * 之后如果有任何重复的字母,那么不要考虑 2ns 字符串取下一个。
  3. 保留唯一的前 3 个字符串并将它们拆分为 * 并制作 2 个单独的列

示例:对于 c1 中的第一行,

  1. z,r,s 没有 *,所以删除它们
  2. 在 a*k 和 x *k 中,k 是重复的,所以保留第一个
  3. 所以前 3 名将是 a*k、c *m、f *f,将其拆分为 2 列 c2、a、c、f 和 c3 k、m、f。

预期 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.extractallGroupBy.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM