Создание новой строки всякий раз, когда в столбце появляется запятая - PullRequest
0 голосов
/ 19 ноября 2018

Я пытаюсь создать мини-программу, которая будет рассчитывать ближайший, открытый ресторан, ближайший к моему местоположению. У меня есть набор данных, который включает названия ресторанов, мест, звезд и часов. Однако есть проблема: иногда в ресторане может быть несколько открытий / закрытий раз в день.

Например:

Name, location, type, and hours

Blue Duck Tavern, 1201 24th St NW, American Restaurant, 6:30-10:30AM, 11:30AM-2PM,5:30-10:30PM

Я пытаюсь получить данные в CSV, но для ресторанов с несколькими часами (как в примере), он не может правильно их проанализировать.

Самым простым решением для этого было бы (я думаю) создать еще одну строку с той же информацией, но следующим набором часов. Итак, пример будет выглядеть так:

Blue Duck Tavern, 1201 24th St NW, American Restaurant, 6:30-10:30AM

Blue Duck Tavern, 1201 24th St NW, American Restaurant, 11:30AM-2PM

Blue Duck Tavern, 1201 24th St NW, American Restaurant, 5:30-10:30PM

Так что программа не показала бы ресторан, если бы он не был открыт.

Итак, у меня есть три общих вопроса. 1) Есть ли лучший способ сделать это, чем решение, которое я упомянул выше (создание новой строки для каждой итерации нескольких часов открытия / закрытия) 2) Ниже у меня проблема со следующей реализацией:

import pandas as pd
import numpy as np

data = pd.import_csv(data.csv)
for row in data: 
    if data['hours'].str.contains(',') == 'True':
        count = data['hours'].str.count(',')
        data.append.. 
        <create new row with Name[row], location[row], type[row], and hours[row] for the # of count>

Я пробовал гуглить, и я получаю эту ошибку: ValueError: Истинное значение Серии неоднозначно. Используйте a.empty, a.bool (), a.item (), a.any () или a.all ().

Поэтому я попытался переключить его на:

if data['Monday'].any('Monday').str.contains(',') == 'True': 

, что приводит к: ValueError: Нет оси с именем понедельник для типа объекта

И мне немного непонятно, что делать дальше или что я делаю неправильно, потому что если я просто сделаю:

print data[data['Monday'].astype(str).str.contains(',')]

Работает и возвращает результат. Но я не могу сделать ничего условного без того, чтобы это выдало ошибку.

3) Я также немного озадачен тем, что делать, если в строке несколько запятых ... У меня есть смутная идея, но если у вас есть какие-либо подсказки, я бы хотел их услышать :)

Спасибо за чтение!

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

попробуйте объединить несколько часов с «_» или любым другим разделителем, как указано ниже, и взять его в целом.

6: 30-10: 30AM_11: 30 AM-2PM_5: 30-10: 30 PM

Таверна Blue Duck, 1201, 24-я СЗ, Американский ресторан, 6: 30-10: 30: 00: 11: 30-2: 00: 05: 30: 30: 30

0 голосов
/ 19 ноября 2018

Если я правильно понимаю, вы можете загрузить данные с регулярным выражением в качестве разделителя, убедившись, что перед запятой не AM или PM (используя отрицательный взгляд за ). Затем вы можете использовать str.split и stack после установки всех столбцов, которые вы не хотите изменять в индексе. Например:

data = pd.read_csv('data.csv', sep='(?<!AM|PM),')
# Get rid of spaces in your column names
data.columns = data.columns.str.strip(' ')

>>> data
               Name          location                  type   hours
0  Blue Duck Tavern   1201 24th St NW   American Restaurant   6:30-10:30AM, 11:30AM-2PM,5:30-10:30PM 


new_data = (data.set_index(['Name', 'location', 'type'])
          .hours.str.split(',', expand=True)
          .stack()
          .reset_index(level=['Name', 'location', 'type']))

>>> new_data
               Name          location                  type              0
0  Blue Duck Tavern   1201 24th St NW   American Restaurant   6:30-10:30AM
1  Blue Duck Tavern   1201 24th St NW   American Restaurant    11:30AM-2PM
2  Blue Duck Tavern   1201 24th St NW   American Restaurant   5:30-10:30PM
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...