Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.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 如何将包含列表作为字段的pandas数据帧拆分为多索引数据帧?_Python_Pandas_Split - Fatal编程技术网

Python 如何将包含列表作为字段的pandas数据帧拆分为多索引数据帧?

Python 如何将包含列表作为字段的pandas数据帧拆分为多索引数据帧?,python,pandas,split,Python,Pandas,Split,我有一个pandas数据框架,它包含作为元素的列表(而不是numpy数组),并希望将其分解为一个分层索引的数据框架。 以下是我试图实现的一个示例: 我有一个这种形式的数据框架: | Model | Company | Url | Criteria | Rating 1| Mode11 | Company1 | Url1 |[Criteria1, Criteria2] | [Rating1 , Rating2] 2| Mode12 | Compan

我有一个pandas数据框架,它包含作为元素的列表(而不是numpy数组),并希望将其分解为一个分层索引的数据框架。 以下是我试图实现的一个示例: 我有一个这种形式的数据框架:

 | Model  | Company  | Url  | Criteria              |    Rating
1| Mode11 | Company1 | Url1 |[Criteria1, Criteria2] | [Rating1 , Rating2]     
2| Mode12 | Company2 | Url2 |[Criteria4, Criteria5] | [Rating4, Rating5]
进入

import sys#如果从文件读取数据,则不需要StringIO
如果系统版本信息[0]<3:
从StringIO导入StringIO
其他:
从io导入StringIO
作为pd进口熊猫
dfstr=StringIO(“|模型|公司| Url |标准|评级
1 |模式11 |公司1 | Url1 |[标准1,标准2]|[评级1,评级2]
2 |模式12 |公司2 | Url2 |[标准4,标准5]|[评级4,评级5]“”)
df=pd.DataFrame.from_csv(dfstr,sep='|')
df.columns=['Model'、'Company'、'Url'、'Criteria'、'Rating']#无空格
def slist(listish):#没有引号的列表有点痛苦
返回listish.strip(“[]”)。拆分(“,”)
def row2df(oldrow):#为每行创建一个小的子数据帧
tmp=pd.DataFrame(zip(slist(第[1]行)。标准),slist(第[1]行。评级)))
对于['Model'、'Company'、'Url']中的val:
tmp[val]=行[1][val]
返回tmp
outdf=pd.concat([row2df(row)表示df.iterrows()中的行)#并将它们粘在一起
outdf.index=outdf[0]#标准索引
外倾下降(0,轴=1,在位=True)
outdf.columns=['Rating'、'Model'、'Company'、'Url']#整理名称
打印(国防军)

标准和评级列之间的关系是什么?你想根据哪一个建立索引,或者两者都是?为了澄清,为什么在您想要的结果中,
评级
元素会被拆分?标准和评级列表是否始终具有相同的长度和顺序,或者您是否需要解析名称以找出哪些匹配?标准和评级始终具有相同的长度和顺序。[其中每个标准与评级有一对一的关系]@offbyone抱歉忘了通知您我的comment@cphlewis而且[新手问题]很酷。如果你考虑回答的问题,在答案的左上角有一个复选标记,可以这么说。(也给了我一些stackoverflow积分。)说我投赞成票需要15点声誉。一旦我得到15分,我会投票支持你的答案。你真的为我节省了很多时间。谢谢你提出这个问题,我想你会说这是一个答案——复选标记在投票向下箭头下。(也欢迎来到StackOverflow。)
               |Model | Company |  Url  | Rating
               ----------------------------------
     Criteria 1|Model1| Company1| Url1  |Rating1
     Criteria 2|Model1| Company1| Url1  |Rating2
     Criteria 3|Model1| Company1| Url1  |Rating3
     Criteria 4|Model2| Company2| Url2  |Rating4
     Criteria 5|Model2| Company2| Url2  |Rating5
     Criteria 6|Model2| Company2| Url2  |Rating6
import sys # you don't need StringIO if you're reading the data from a file
if sys.version_info[0] < 3:
    from StringIO import StringIO
else:
    from io import StringIO 
import pandas as pd


dfstr = StringIO(""" | Model  | Company  | Url  | Criteria              |    Rating
1| Mode11 | Company1 | Url1 |[Criteria1, Criteria2] | [Rating1 , Rating2]
2| Mode12 | Company2 | Url2 |[Criteria4, Criteria5] | [Rating4, Rating5]""")
df = pd.DataFrame.from_csv(dfstr, sep='|')
df.columns = ['Model','Company','Url','Criteria','Rating'] # no whitespace


def slist(listish): # list-without-quotes is kind of a pain
    return listish.strip(' []').split(', ')

def row2df(oldrow): # make a little sub-DataFrame for each row 
    tmp = pd.DataFrame(zip(slist(row[1].Criteria),slist(row[1].Rating)))
    for val in ['Model','Company','Url']:
        tmp[val] = row[1][val]
    return tmp


outdf = pd.concat([row2df(row) for row in df.iterrows()]) # and stick them together
outdf.index = outdf[0] # index on the Criteria
outdf.drop(0, axis=1,inplace=True) 
outdf.columns = ['Rating','Model','Company','Url'] # tidy up the names
print(outdf)