以下是我的未标记数据集中的两行,一小部分:
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'
此处的相关(和未答复)问题:How to import unlabeled and missing columns into a pandas dataframe?
答案 0 :(得分:1)
这样做:
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:]