Как разделить ключ, значение из текстового файла с помощью панд?

У меня есть входной текстовый файл, например:

Input.txt-

1=88|2=1438|3=KKK|4=7.7|5=00|7=66|8=a
1=13|2=1388|3=DDD|4=157.73|6=00|7=08|8=b|9=k

Я хочу разделить эти пары ключ и значение и показать в таком формате:

Output.txt-

index[0]
1     88
2     1438
3     kkk
4     7.7
5     00
6     
7     66
8     a
9    

index[1]
1     13
2     1438
3     DDD
4     157.73
5    
6     00
7     08
8     b
9     k

см. В индексе [0] значения 6 и 9-й записи являются пустыми, потому что 6 доступно в другом столбце, но не в этом. Так, в индексе [1] пятая запись пуста.

Программный код-

df = pd.read_csv(inputfile, index_col=None, names=['text'])

    #spliting two times with respect to (= & |) and saving into stack
    s = df.text.str.split('|', expand=True).stack().str.split('=', expand=True)

    #giving index's as empty string ('') i.e. for removing
    s.columns = ['idx','']

    #rename_axis(None) for excluding index values  
    dfs = [g.set_index('idx').rename_axis(None) for i, g in s.groupby(level=0)]

    #length for iterating through list
    dfs_length = len(dfs)


    #opening output file
    with open(outputfile + 'output.txt','w') as file_obj:
        i = 0
        while i < dfs_length:
            #index of each column
            s = '\nindex[%d]\n'%i
            #writing index to file
            file_obj.write(str(s))
            #print '\nindex[%d]'%i
            #print dfs[i]
            #wriring actual contents to file
            file_obj.write(str(dfs[i])+'\n')
            i = i + 1

Я получаю такой результат:

output.txt-

index[0]
1     88
2     1438
3     kkk
4     7.7
5     00
7     66
8     a

index[1]
1     13
2     1438
3     DDD
4     157.73
6     00
7     08
8     b
9     k

Я получаю только те записи, которые доступны во входных текстовых файлах. Как я могу сохранить значение записи как пустое?


person kitty    schedule 14.07.2016    source источник
comment
Похоже на домашнее задание.   -  person Ernest Ten    schedule 14.07.2016
comment
@ErnestTen, нет. ИМО, это интересный вопрос ...   -  person MaxU    schedule 14.07.2016
comment
@kitty, у вас есть фиксированное количество атрибутов (_1 _, ..., 9=...)?   -  person MaxU    schedule 14.07.2016
comment
@ MaxU- Нет, это не исправлено. Я должен оставить поле пустым или NaN.   -  person kitty    schedule 14.07.2016


Ответы (1)


вы можете сделать это, используя функцию .str.extract() в сочетании со сгенерированным RegEx:

pat = r'(?:1=)?(?P<a1>[^\|]*)?'

# you may want to adjust the right bound of the range interval
for i in range(2, 12):
    pat += r'(?:\|{0}=)?(?P<a{0}>[^\|]*)?'.format(i)

new = df.val.str.extract(pat, expand=True)

Тестовое задание:

In [178]: df
Out[178]:
                                            val
0         1=88|2=1438|3=KKK|4=7.7|5=00|7=66|8=a
1  1=13|2=1388|3=DDD|4=157.73|6=00|7=08|8=b|9=k
2                                1=11|3=33|5=55

In [179]: new
Out[179]:
   a1    a2   a3      a4  a5  a6  a7 a8 a9 a10 a11
0  88  1438  KKK     7.7  00      66  a
1  13  1388  DDD  157.73      00  08  b  k
2  11         33          55
person MaxU    schedule 14.07.2016