2016-06-06 1 views
2

Учитывая файл с следующим форматом:Как читать текстовый файл с нечетным количеством столбцов с python-pandas?

really:1 christensen:1 scariest:1 many_of:1 label:positive 
varied_experiences:1 experiences_from:1 island_resident:1 many_and:1 label:positive 
scariest:1 many_of:1 label:negative 

Последнего столбцом является метка полярности, со значениями отрицательным или положительным. Остальные столбцы перед ним представляют собой суммарное представление соответствующего абзаца. Как я могу прочитать файл в фрейме данных с двумя столбцами, в котором первая - строка с мешком, а вторая - метка? Заранее спасибо!

+0

Сколько строк имеет выход? '3' или' 10'? – jezrael

+0

@jezrael Спасибо за ответ. Но я немного смущен тем, что вы подразумеваете под «выходом». Вы спрашиваете, сколько строк имеет «метка»? Если тогда все строки имеют метки – user5779223

+0

, см. Ответ с тремя строками. – jezrael

ответ

1

Вам нужно только read_csv:

import pandas as pd 
import io 

temp=u"""really:1 christensen:1 scariest:1 many_of:1 label:positive 
varied_experiences:1 experiences_from:1 island_resident:1 many_and:1 label:positive 
scariest:1 many_of:1 label:negative""" 
#after testing replace io.StringIO(temp) to filename 
df = pd.read_csv(io.StringIO(temp), 
       sep=r" label:", 
       header=None, 
       names=['bag','label'], 
       engine='python') 
print (df) 
               bag  label 
0  really:1 christensen:1 scariest:1 many_of:1 positive 
1 varied_experiences:1 experiences_from:1 island... positive 
2        scariest:1 many_of:1 negative 

Более общее решение, которое rsplit последним пробелом:

import pandas as pd 
import io 

temp=u"""really:1 christensen:1 scariest:1 many_of:1 label:positive 
varied_experiences:1 experiences_from:1 island_resident:1 many_and:1 label:positive 
scariest:1 many_of:1 label:negative""" 
#after testing replace io.StringIO(temp) to filename 
df = pd.read_csv(io.StringIO(temp), 
       sep=";", #some string which is NOT in all text 
       header=None, 
       names=['text']) 
print (df) 
               text 
0 really:1 christensen:1 scariest:1 many_of:1 la... 
1 varied_experiences:1 experiences_from:1 island... 
2    scariest:1 many_of:1 label:negative 

df[['bag','label']] = df.text.str.rsplit(expand=True, n=1) 
df = df.drop('text', axis=1) 
print (df) 
               bag   label 
0  really:1 christensen:1 scariest:1 many_of:1 label:positive 
1 varied_experiences:1 experiences_from:1 island... label:positive 
2        scariest:1 many_of:1 label:negative 
+0

Да, это хороший трюк ... Но, возможно, трудно довести его до подобных проблем. Что, если нет слова «метка»? Но я отвечу на ваш ответ, поскольку он решает мой вопрос. Большое спасибо! – user5779223

+0

Я добавляю более общее решение. – jezrael

+0

Это здорово! Спасибо за вашу работу! – user5779223