每当列中出现逗号时,创建一个新行

时间:2018-11-19 19:13:06

标签: python pandas numpy

我正在尝试创建一个迷你程序,该程序将计算最接近我所在位置的最近开放餐厅。我有一个包含餐厅名称,位置,星级和营业时间的数据集。但是,存在一个问题:有时一家餐厅一天会有多次开/关时间。

例如:

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)如果行中有多个逗号,我对该方法也有些困惑。我有一个模糊的主意,但是如果您有任何提示,我很想听听他们:)

感谢阅读!

2 个答案:

答案 0 :(得分:1)

如果我理解正确,则可以使用正则表达式作为分隔符来加载数据,并确保逗号之前不是AMPM(使用negative lookbehind) 。在将所有不想修改的列设置为索引之后,可以使用str.splitstack。例如:

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