Python 使用多个分隔符拆分多个列;新形成的列应具有原始值的计数

Python 使用多个分隔符拆分多个列;新形成的列应具有原始值的计数,python,pandas,split,count,Python,Pandas,Split,Count,我是python编程新手。我处理的数据中,某些属性的子集是在单个超集(即列/属性)内获得的(使用非字母数字分隔符) 代表性数据: 可乐 可乐 可乐 1. x/x/z/z/z i\i\i\j 2. y/y/z/w/w/w k\k\i 这里是一个使用df.stack,然后series.split的方案,然后是series.explode和pd.crosstab u = df[['col2','col3']].stack().str.split(r"\\|/").explode()

我是python编程新手。我处理的数据中,某些属性的子集是在单个超集(即列/属性)内获得的(使用非字母数字分隔符)

代表性数据:

可乐 可乐 可乐 1. x/x/z/z/z i\i\i\j 2. y/y/z/w/w/w k\k\i
这里是一个使用
df.stack
,然后
series.split
的方案,然后是
series.explode
pd.crosstab

u = df[['col2','col3']].stack().str.split(r"\\|/").explode()
v = u.add("_"+ u.index.get_level_values(1))

out = pd.crosstab(v,v.index.get_level_values(0)).T.rename_axis(index=None,columns=None)

编辑:

根据编辑的问题,您可以对col4和col5执行类似的步骤,然后执行concat:

u = df[['col2','col3']].stack().str.split(r"\\|/").explode()
v = u.add("_"+ u.index.get_level_values(1))

a = df[['col4','col5']].stack().str.split("-|_",expand=True).unstack()
a.columns = a.columns.map("{0[0]}_{0[1]}".format)

out = (pd.concat((df[['col1']],
                  pd.crosstab(v,v.index.get_level_values(0))
                     .T.rename_axis(index=None,columns=None),
                  a),axis=1))
print(out)


注意:您可以使用
df[['col1']]。加入(out)
在最终输出中包含
col1
。这样就解决了问题。很抱歉,我忘了在输入表示法中再添加一个变体。假设有一个col4,其值类似于0/2/4/2。这里的一个小区别是:1.)这些是子集合本身的计数(比如,A=0,B=2,C=4,D=2)。2.)在整个数据中具有相同的宽度(此处为4)3.)位置相关(始终为A/B/C/D)。我将不得不单独处理此列的变化;简单的拆分然后强制转换,对吗?@nyasa,你想如何将其连接到输出。我目前没有使用我的计算机,因此无法进行测试,但是如果您使用了
pd.DataFrame(df['col4'].str.split(r'/').tolist())
,然后将其连接到输出。这就是你想要的吗?如果你不想编辑这个问题或者发布一个你认为最好的新问题:)谢谢,我知道了方向。但是,
pd.DataFrame
部分引发
TypeError:type'float'的对象没有len()
。但我可以从这里开始工作。@nyasa try
df['col4'].str.split(r'/',expand=True)
可能是:-)这将为您提供一个将值拆分为单独列的数据框架。然后你就可以加入dfs了。很抱歉给您带来不便,我出去工作了,现在没有在电脑前
u = df[['col2','col3']].stack().str.split(r"\\|/").explode()
v = u.add("_"+ u.index.get_level_values(1))

a = df[['col4','col5']].stack().str.split("-|_",expand=True).unstack()
a.columns = a.columns.map("{0[0]}_{0[1]}".format)

out = (pd.concat((df[['col1']],
                  pd.crosstab(v,v.index.get_level_values(0))
                     .T.rename_axis(index=None,columns=None),
                  a),axis=1))
print(out)
   col1  i_col3  j_col3  k_col3  w_col2  x_col2  y_col2  z_col2 0_col4 0_col5  \
0     1       3       1       0       0       2       0       3      0      1   
1     2       1       0       2       3       0       2       1      1      4   

  1_col4 1_col5 2_col4 2_col5 3_col4 3_col5  
0      2      2      4      5      2      3  
1      3      1      2      3      2      4