我正在尝试创建一个迷你程序,该程序将计算最接近我所在位置的最近开放餐厅。我有一个包含餐厅名称,位置,星级和营业时间的数据集。但是,存在一个问题:有时一家餐厅一天会有多次开/关时间。
例如:
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:没有为对象类型命名为Monday的轴
对于这里的下一步操作或我做错的事情,我还是不清楚,因为如果我这样做的话:
print data[data['Monday'].astype(str).str.contains(',')]
它可以工作并返回结果。但是,如果不抛出错误,我将无法执行任何条件的操作。
3)如果行中有多个逗号,我对该方法也有些困惑。我有一个模糊的主意,但是如果您有任何提示,我很想听听他们:)
感谢阅读!
答案 0 :(得分:1)
如果我理解正确,则可以使用正则表达式作为分隔符来加载数据,并确保逗号之前不是AM
或PM
(使用negative lookbehind) 。在将所有不想修改的列设置为索引之后,可以使用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
答案 1 :(得分:0)
尝试将多个小时与“ _”或如下所述的任何其他定界符组合在一起,并将其作为一个整体。
6:30-10:30AM_11:30 AM-2PM_5:30-10:30PM
Blue Duck Tavern,西北大街24号1201,美国餐厅,6:30-10:30AM_11:30 AM-2PM_5:30-10:30PM