Python 使用多个分隔符拆分多个列;新形成的列应具有原始值的计数
我是python编程新手。我处理的数据中,某些属性的子集是在单个超集(即列/属性)内获得的(使用非字母数字分隔符) 代表性数据: 可乐 可乐 可乐 1. x/x/z/z/z i\i\i\j 2. y/y/z/w/w/w k\k\iPython 使用多个分隔符拆分多个列;新形成的列应具有原始值的计数,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()
这里是一个使用
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 trydf['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