Python 如何将列的标记值解析为数据帧(缺少某些列值)?
以下是我的未标记数据集中的两行,一个小子集:Python 如何将列的标记值解析为数据帧(缺少某些列值)?,python,parsing,pandas,dataframe,Python,Parsing,Pandas,Dataframe,以下是我的未标记数据集中的两行,一个小子集: random1 147 sub1 95 34 dewdfa3 15000 -1238 SBAASBAQSBARSBATSBAUSBAXBELAAX AAA:COL:UVTWUVWDUWDUWDWW BBB:COL:F CCC:COL:GTATGTCA DDD:COL:K20 EEE:COL:54T GGG:COL:-30.5 HHH:COL:000.1 III:COL:2 JJJ:COL:0 r
random1 147 sub1 95 34 dewdfa3 15000 -1238 SBAASBAQSBARSBATSBAUSBAXBELAAX AAA:COL:UVTWUVWDUWDUWDWW BBB:COL:F CCC:COL:GTATGTCA DDD:COL:K20 EEE:COL:54T GGG:COL:-30.5 HHH:COL:000.1 III:COL:2 JJJ:COL:0
random2 123 sub1 996 12 kwnc239 10027 144 LBPRLBPSLBRDLBSDLBSLLBWB AAA:COL:UWTTUTUVVUWWUUU BBB:COL:F DDD:COL:CACGTCGG EEE:COL:K19 FFF:COL:HCC16 GGG:COL:873 III:COL:-77 JJJ:COL:0 KKK:COL:0 LLL:COL:1 MMM:COL:212
前九列在整个数据集中是一致的,并且可以标记
我的问题在于以下几列。然后,此行中的每个值首先用列值标记,例如,AAA:COL:UVTWUVWDUWDUWDWW
是列AAA
,BBB:COL:F
是列BBB
,等等
但是,(1)每行的列数不同,(2)某些列“缺失”。第一行缺少列FFF
,第二行跳过列CCC
和HHH
另外,请注意,第一行在列JJJ
处停止,而第二列在列MMM
处停止
如何分配数据帧的9+13列,并解析这些值,以便在column:value
对不存在的情况下,该列将具有NaN
值
像pandas.read_table()这样的东西是否具有此功能
这是第一行的“正确”格式:
random int sub int2 int3 string1 int4 int5 string2 AAA BBB CCC DDD EEE FFF GGG .... MMM
random1 147 sub1 95 34 dewdfa3 15000 -1238 SBAASBAQSBARSBATSBAUSBAXBELAAX UVTWUVWDUWDUWDWW F DFADFADFA K20 54T 'NaN' -30.5 ....'NaN'
相关(未回答)问题如下:这样就可以了:
text = """random1 147 sub1 95 34 dewdfa3 15000 -1238 SBAASBAQSBARSBATSBAUSBAXBELAAX AAA:COL:UVTWUVWDUWDUWDWW BBB:COL:F CCC:COL:GTATGTCA DDD:COL:K20 EEE:COL:54T GGG:COL:-30.5 HHH:COL:000.1 III:COL:2 JJJ:COL:0
random2 123 sub1 996 12 kwnc239 10027 144 LBPRLBPSLBRDLBSDLBSLLBWB AAA:COL:UWTTUTUVVUWWUUU BBB:COL:F DDD:COL:CACGTCGG EEE:COL:K19 FFF:COL:HCC16 GGG:COL:873 III:COL:-77 JJJ:COL:0 KKK:COL:0 LLL:COL:1 MMM:COL:212"""
data = [line.split() for line in text.split('\n')]
data1 = [line[:9] for line in data]
data2 = [line[9:] for line in data]
# list of dictionaries from data2, where I parse the columns
dict2 = [[dict([d.split(':COL:') for d in d1]) for d1 in data2]
result = pd.concat([pd.DataFrame(data1),
pd.DataFrame(dict2)],
axis=1)
result.iloc[:, 9:]
我看到一个
'III:a:2'
。请解释这是什么。@piRSquared列I(即大写字母“I”)位于H列之后和J列之前。我的意思是,'III:A:2'
不一致。除了'III:a:2'
和'HHH:B:000.1'
之外,其他每个条目中都有一个':列:'
。你没有在帖子中解释这些应该如何解释。@piRSquared我怀疑这是数据的残余。应解释为“III”列和“HHH”列。我将对上面的内容进行编辑,以减少这个问题(已经)的复杂性。然后,我下面的答案将回答您上面的问题,我只包括两行。实际上,有数千行。您可以编辑上面的内容以在行之间进行解析吗?我用这种方式显示了所有数据。我调换了位置。显然,这不是个好主意<代码>结果是您的答案<代码>结果。iloc[:,9:://code>只是显示具有挑战性的列,以便我可以打印它们。抱歉,我误解了第二行代码。谢谢,我不知道为什么我以前很困惑。