2015-09-03 3 views
0

Я фильтрую список для тех записей, которые содержат ключевое слово в одном столбце. Общий список, выходы определяются как:Python Pandas фильтрация и создание новой dataframe

outputs = 
sent_name Name Lat Lng type 
    Abbey Road Station, London, UK Abbey Road, London E15, UK 51.53193 0.00376 [u'transit_station', u'point_of_interest', u'establishment'] 
    Abbey Wood Station, London, UK Abbey Wood, London SE2, UK 51.49106 0.12142 [u'transit_station', u'point_of_interest', u'establishment'] 

Я ищу выход [3] для строки «станции», а затем добавить результаты, где это верно для пустого списка, результатов. По -

results = [] 

for output in outputs: 
    if "station" in output[3]: 
     results.append(output) 

Я хотел бы использовать панд для дальнейшего анализа, но не знаю, как воссоздать DataFrame после фильтрации этих результатов.

OD = pd.read_csv('./results.csv', header=0) 

Где, results.csv снова:

sent_name Name Lat Lng type 
Abbey Road Station, London, UK Abbey Road, London E15, UK 51.53193 0.00376 [u'transit_station', u'point_of_interest', u'establishment'] 
Abbey Wood Station, London, UK Abbey Wood, London SE2, UK 51.49106 0.12142 [u'transit_station', u'point_of_interest', u'establishment'] 

Используя iterrows, я могу перебрать строки в панде dataframe и отфильтровывать те, где существует «станция» в столбце типа ,

for index, row in OD.iterrows(): 
     if "station" in row['type']: 

Однако из этого я не смог создать новый DataFrame. Моя конечная цель - создать новый csv (который содержит только записи, которые содержат «станцию» в столбце типа), используя функцию .to_csv в Pandas.

Я попытался создать новый DataFrame с соответствующими именами индексов. Затем фильтрации, как описаны выше, и попытка добавить эти результаты к новому dataframe

OD_filtered = pd.DataFrame(index=['sent_name','Name','Lat', 'Lng', 'type']) 

for index, row in OD.iterrows(): 
    if "station" in row['type']: 
     OD_filtered.append([row['sent_name'], row['Name'], row['Lat'], row['Lng'], row['type']]) 

pprint(OD_filtered) 

Однако это не удается написать dataframe и остается пустыми. При печати (OD_filtered) это дает:

Empty DataFrame 
Columns: [] 
Index: [sent_name, Name, Lat, Lng, type] 
+1

Ваш 'read_csv' код не должен работать как ваш CSV имеет несколько запятых, но помимо этого, вы должны быть в состоянии сделать' new_df = OD [OD.apply (лямбда х: «станции» х ['type'], axis = 1)] 'Я думаю – EdChum

+0

Очень элегантный. Я пропустил метод OD.apply. Пожалуйста, поставьте это как ответ, и я могу отметить его правильно – LearningSlowly

ответ

2

Вы можете создать булеву маску вызова apply на колонку «типа», чтобы создать новый ДФ:

In [37]: 
import io 
import pandas as pd 
t="""sent_name;Name;Lat;Lng;type 
Abbey Road Station, London, UK;Abbey Road, London E15, UK;51.53193;0.00376;[u'transit_station', u'point_of_interest', u'establishment'] 
Abbey Wood Station, London, UK;Abbey Wood, London SE2, UK;51.49106;0.12142;[u'transit_station', u'point_of_interest', u'establishment']""" 
df = pd.read_csv(io.StringIO(t), sep=';') 
df 

Out[37]: 
         sent_name      Name  Lat \ 
0 Abbey Road Station, London, UK Abbey Road, London E15, UK 51.53193 
1 Abbey Wood Station, London, UK Abbey Wood, London SE2, UK 51.49106 

     Lng            type 
0 0.00376 [u'transit_station', u'point_of_interest', u'e... 
1 0.12142 [u'transit_station', u'point_of_interest', u'e... 

In [39]:  
# filter the df 
df[df['type'].apply(lambda x: 'station' in x)] 

Out[39]: 
         sent_name      Name  Lat \ 
0 Abbey Road Station, London, UK Abbey Road, London E15, UK 51.53193 
1 Abbey Wood Station, London, UK Abbey Wood, London SE2, UK 51.49106 

     Lng            type 
0 0.00376 [u'transit_station', u'point_of_interest', u'e... 
1 0.12142 [u'transit_station', u'point_of_interest', u'e... 

Так что в вашем случае следующий должны работа:

new_df = OD[OD['type'].apply(lambda x: 'station' in x)] 
Смежные вопросы