Python 如何将包含列表作为字段的pandas数据帧拆分为多索引数据帧?
我有一个pandas数据框架,它包含作为元素的列表(而不是numpy数组),并希望将其分解为一个分层索引的数据框架。 以下是我试图实现的一个示例: 我有一个这种形式的数据框架: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
| 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)