Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python或excel vba将单个excel单元格内容拆分为不同的单元格_Python_Excel_Python 3.x_Vba_Pandas - Fatal编程技术网

使用Python或excel vba将单个excel单元格内容拆分为不同的单元格

使用Python或excel vba将单个excel单元格内容拆分为不同的单元格,python,excel,python-3.x,vba,pandas,Python,Excel,Python 3.x,Vba,Pandas,我有一个如下所示格式的数据,可以使用下面给出的Python代码对其进行生成 df = pd.DataFrame({'Person_id':[1,2,3,4], 'Values':['father:1.Yes 2.No 3.Do not Know','Mother:1.Yes 2.No 3.Do not Know','sons:1.Yes 2.No 3.Do not Know','daughter:1.Yes 2.No 3.Do not Know'], 'Ethnicity':['dff

我有一个如下所示格式的数据,可以使用下面给出的Python代码对其进行生成

df = pd.DataFrame({'Person_id':[1,2,3,4],
'Values':['father:1.Yes 2.No 3.Do not Know','Mother:1.Yes 2.No 3.Do not 
 Know','sons:1.Yes 2.No 3.Do not Know','daughter:1.Yes 2.No 3.Do not Know'],
   'Ethnicity':['dffather','dfmother','dfson','dfdaughter']})

我想做的是根据单元格中可用值的数量,将“值”单元格内容拆分为3行/n行。在这种情况下,我们有3个选项(1.是,2.否和3.不知道)。我不希望像父亲、母亲、儿子等那样保留文本。我只希望有选择权

我如何使我的输出如下图所示

请注意,选项和值可能实时不同。我所展示的是一个示例,在答案选项方面不存在任何模式。

一种方法可以是(熊猫):



VBA的角度来看,这是一种方法:

选项显式
子拆分()
将ws设置为工作表:设置ws=ActiveWorkbook.Sheets(“工作表名称”)
Dim arrData作为变量,arrValues()作为字符串
Dim arrTmp()作为字符串:ReDim arrTmp(1到2,1到1)
Dim arrFinal()作为字符串
将lrow变长:lrow=ws.Cells(Rows.Count,1).End(xlUp).Row
变暗R为长,C为长,X为长,Z为长
arrData=ws.范围(“A1:C”和lrow)
R=LBound(arrData)+1至UBound(arrData)
arrData(R,2)=替换(“df”和arrData(R,2),arrData(R,3)和“:”,“”)
arrValues=拆分(arrData(R,2),“)
对于X=LBound(arrValues)到UBound(arrValues)
如果X+1=UBound(ARR值),则
arrValues(X)=X+1&“&”和arrValues(X+1)
ReDim值(X)
退出
其他的
arrValues(X)=X+1&“”&左(arrValues(X+1),Len(arrValues(X+1))-2)
如果结束
下一个X
对于X=LBound(arrValues)到UBound(arrValues)
Z=Z+1
ReDim保留arrTmp(1到2,1到Z)
如果X=0,则arrTmp(1,Z)=R-1
arrTmp(2,Z)=arrTmp值(X)
下一个X
下一个R
ReDim ARRTIMAL(LBound(arrTmp,2)至UBound(arrTmp,2),LBound(arrTmp)至UBound(arrTmp))
R=LBound(arrFinal)至UBound(arrFinal)
对于C=lBond(arrFinal,2)到uBond(arrFinal,2)
arrtfinal(R,C)=arrTmp(C,R)
下一个C
下一个R
带ws.Range(“E1”)
.调整大小(UBound(arrFinal),UBound(arrFinal,2))=arrFinal
以
端接头
结果是:

很酷。任务。你的任务?你是怎么解决的?您的解决方案的具体问题在哪里?请向我们展示您的[mce]。我做了一些工作,并将数据作为变量数组返回到VBA中(准备粘贴到单元格中)。这是我的博客,我使用Python网关类模式
toList()
是将Python数据结构转换为VBA可使用的数据结构的关键。我将尝试这些答案,并很快在此处更新解决方案。下面提供的两个答案都运行良好。我正在标记Python方法,因为对于像我这样的初学者来说它很容易理解。尽管如此,ExcelVBA还是一个有效且有效的解决方案。两个答案都投了赞成票Shello@anky_91-我确实试过你的答案。它很好用。然而,为了获得预期的输出,我添加了以下两行,因为我不希望重复种族和个人id列中的值。虽然我这样做了,但我觉得这是一个漫长的过程。下面是我的另一段代码,它使重复值“m['ocidentity']=m[('ocidentity')].mask(~m['new_Value'].str.startswith('1'))m['Person_id']=m[('Person_id')].mask(~m['new_Value'].str startswith('1'))”@AVLES我想你需要
m.loc[m.duplicated(['Person_id','ocidentity']),['Person_id','=''
然后打印m以进行检查。:)在上面的例子中,如果我想根据输入的源值对其进行排序,您能告诉我如何进行吗?例:1:是,2:否,777:不适用,999:不知道。正如你所看到的,它不是3和4,而是777和999。我希望保留这些价值观is@AVLES嗯。。我认为这需要一种不同的(复杂的)方法。既然这个问题已经回答了,我建议你发布一个新的问题。谢谢@anky_91。这里是链接
s=df.Values.str.findall('(\D+)').str[1:]
m=(df.reindex(df.index.repeat(s.str.len()))
   .assign(new_Value=np.concatenate(s.values)).drop('Values',1))
m.new_Value=m.groupby('Person_id').cumcount().add(1).astype(str)+m.new_Value
print(m)
   Person_id   Ethnicity      new_Value
0          1    dffather         1.Yes 
0          1    dffather          2.No 
0          1    dffather  3.Do not Know
1          2    dfmother         1.Yes 
1          2    dfmother          2.No 
1          2    dfmother  3.Do not Know
2          3       dfson         1.Yes 
2          3       dfson          2.No 
2          3       dfson  3.Do not Know
3          4  dfdaughter         1.Yes 
3          4  dfdaughter          2.No 
3          4  dfdaughter  3.Do not Know