我是 python 的新手,有一個 Pandas 資料框,它是附加多個物體的結果。以下是資料框的示例(它可以比這更大):
| 主標簽 | 標簽 | 價值 |
|---|---|---|
| 基因型 | 基因型 | 121175336 |
| 地位 | 地位 | 居住 |
| 創建日期 | 日期-std_year | 2017年 |
| 創建日期 | 日期-std_month | 4 |
| 創建日期 | 日期-std_day | 0 |
| 更新日期 | 日期-std_year | 2021年 |
| 更新日期 | 日期-std_month | 3 |
| 更新日期 | 日期-std_day | 21 |
| org-ref_taxname | org-ref_taxname | Gmax |
| org-ref_db | dbtag_db | 分類單元1 |
| org-ref_db | 物件id_id | 3845 |
| 組織名稱_div | 組織名稱_div | 波蘭茲羅提 |
| 基因型 | 基因型 | 121175335 |
| 地位 | 地位 | 居住 |
| 創建日期 | 日期-std_year | 2011年 |
| 創建日期 | 日期-std_month | 4 |
| 創建日期 | 日期-std_day | 20 |
| 更新日期 | 日期-std_year | 2021年 |
| 更新日期 | 日期-std_month | 4 |
| 更新日期 | 日期-std_day | 21 |
| org-ref_taxname | org-ref_taxname | 甘氨酸 |
| org-ref_db | dbtag_db | 分類單元2 |
| org-ref_db | 物件id_id | 3847 |
| 組織名稱_div | 組織名稱_div | LSA |
| 基因型 | 基因型 | 121175334 |
| 地位 | 地位 | 居住 |
| 創建日期 | 日期-std_year | 2011年 |
| 創建日期 | 日期-std_month | 6 |
| 創建日期 | 日期-std_day | 20 |
| 更新日期 | 日期-std_year | 2018年 |
| 更新日期 | 日期-std_month | 8 |
| 更新日期 | 日期-std_day | 21 |
| org-ref_taxname | org-ref_taxname | 甘氨酸明 |
| org-ref_db | dbtag_db | 分類單元3 |
| org-ref_db | 物件id_id | 38467 |
| 組織名稱_div | 組織名稱_div | 波蘭茲羅提 |
如表所示,從“geneid”到“OrgName_div”的子資料框以不同的值重復,我需要以最快的方式將其轉置并將其更改為如下所示:
| 基因型 | 地位 | 創建日期 | 更新日期 | org-ref_taxname | org-ref_db | org-ref_db | 組織名稱_div |
|---|---|---|---|---|---|---|---|
| 121175336 | 居住 | 2017-4-2 | 2021-3-21 | Gmax | 分類單元1 | 3845 | 波蘭茲羅提 |
| 121175335 | 居住 | 2011-4-20 | 2021-4-21 | 甘氨酸 | 分類單元2 | 3847 | LSA |
| 121175334 | 居住 | 2011-6-20 | 2018-8-21 | 甘氨酸明 | 分類單元3 | 38467 | 波蘭茲羅提 |
這是生成此資料框的代碼,它基本上決議了一個巨大的 xml 檔案:
import numpy as np
import pandas as pd
from lxml import etree
class EntrezGene:
def __init__(self, fh,tg):
self.context = etree.iterparse(fh, events=("end",),tag=tg,huge_tree=True)
def _parse(self):
for event, elem in self.context:
yield elem
elem.clear()
while elem.getprevious() is not None:
del elem.getparent()[0]
def sequence(self, elements):
_elements = {}#[]
for elem in elements:
if len(elem):
_elements[elem.tag]= dict(self.sequence(elem))
else:
_elements[elem.tag] =elem.text
return _elements
def __iter__(self):
for xml_EntrezGene in self._parse():
if len(xml_EntrezGene.attrib):
EntrezGene = {xml_EntrezGene.tag: xml_EntrezGene.attrib[next(iter(xml_EntrezGene.attrib))]} #xml_EntrezGene.attrib
mainTag = xml_EntrezGene.tag
elif len(xml_EntrezGene.text.strip()):#len(xml_EntrezGene.text) :
EntrezGene = {xml_EntrezGene.tag: xml_EntrezGene.text}
mainTag = xml_EntrezGene.tag
else:
EntrezGene = {}
mainTag = xml_EntrezGene.tag
for elem in xml_EntrezGene:
# if elem is Sequence
if len(elem):
# Append tuple(tag, value)
EntrezGene[elem.tag] = self.sequence(elem)
mainTag = elem.getparent().tag
else:
EntrezGene[elem.tag] = elem.text
mainTag = elem.getparent().tag
yield EntrezGene, mainTag
def recursive_items(dictionary):
for key, value in dictionary.items():
if type(value) is dict:
#print(key)
yield from recursive_items(value)
else:
yield (key, value)
poTags =['geneid','status','OrgName_div','Org-ref_db','Org-ref_taxname','create-date', 'update-date']
def extract_xml_inf(xmlFileName, tagNames):
df = pd.DataFrame(columns=['main_tag','tag', 'value'])
with open(xmlFileName, 'rb') as in_xml:
for record in EntrezGene(in_xml,tg=tagNames):
for key, value in record[0].items():
if isinstance(value, (dict)):
for subKey, subValue in recursive_items(value):
df = df.append({'main_tag': record[1],'tag': subKey,'value': subValue}, ignore_index=True)
else:
df = df.append({'main_tag': record[1],'tag': key,'value': value}, ignore_index=True)
#print(df)
return df
我很感激任何幫助。
uj5u.com熱心網友回復:
你可以這樣做:
df1 = df.assign(id = (df.main_tag == 'geneid').cumsum()).\
groupby(['id', 'main_tag']).aggregate({'value':'-'.join}).reset_index().\
pivot('id', 'main_tag', 'value')[df.main_tag.unique()]
print(df1)
main_tag geneid status create-date update-date Org-ref_taxname Org-ref_db OrgName_div
id
1 121175336 live 2017-4-0 2021-3-21 Gmax taxon1-3845 PLN
2 121175335 live 2011-4-20 2021-4-21 Glycine taxon2-3847 LSA
3 121175334 live 2011-6-20 2018-8-21 GlycineMin taxon3-38467 PLN
uj5u.com熱心網友回復:
也許你可以從一開始就以不同的方式處理這個問題。如果您需要追加所有內容,然后重塑,其他人可能會為您提供解決方案。
在連接之前,只轉置值列,然后連接它們。然后您可以對日期進行修改。我沒有使用您的代碼來連接您的資料,因此您必須根據需要修改此陳述句。
# hold individual df in a list
df_hold =[]
for i in range(3):
# .T for transpose
df_hold.append(df[['value']].T)
df = pd.concat(df_hold)
# note the _c in some of the dates to remove the chance of duplicate column names
tags = ['geneid', 'status', 'Date-std_year_c', 'Date-std_month_c', 'Date-std_day_c', 'Date-std_year', 'Date-std_month',
'Date-std_day', 'Org-ref_taxname', 'Dbtag_db', 'Object-id_id', 'OrgName_div']
df.columns = tags
df['create-date'] = df.apply(lambda x: '-'.join([x['Date-std_year_c'], x['Date-std_month_c'], x['Date-std_day_c']]), axis=1)
df['update-date'] = df.apply(lambda x: '-'.join([x['Date-std_year'], x['Date-std_month'], x['Date-std_day']]), axis=1)
# drop unwanted columns
df = df.drop(['Date-std_year_c', 'Date-std_month_c', 'Date-std_day_c', 'Date-std_year', 'Date-std_month',
'Date-std_day'], axis=1).set_index('geneid', drop=True)
這只是運行第一個geneid 3次,這就是為什么每行中的資料都相同
status Org-ref_taxname Dbtag_db Object-id_id OrgName_div create-date update-date
geneid
121175336 live Gmax taxon1 3845 PLN 2017-4-0 2021-3-21
121175336 live Gmax taxon1 3845 PLN 2017-4-0 2021-3-21
121175336 live Gmax taxon1 3845 PLN 2017-4-0 2021-3-21
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/353838.html
上一篇:R僅保持行達到特定條件
