如何将标记的列值解析为Pandas Dataframe(缺少某些列值)?

时间:2016-07-25 18:56:25

标签: 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   

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是列AAABBB:COL:F是列BBB等。

但是,(1)每行的列数不同,(2)某些列“缺失”。第一行缺少列FFF,第二行跳过列CCCHHH

另请注意,第一行在列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?

1 个答案:

答案 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:]

enter image description here