Pandas: 如何过滤Dataframe中的列信息并进行不同的处理

Pandas: How to filter column information in Dataframe and process it differently

我有一个数据框表示一周内一些餐厅的时间​​表。

注意:值00:0-0:0仅表示餐厅当天关闭。

data = {
        'restaurant_id':  ['1', '2','3'],
        'Monday':  ['11:0-20:0', '11:30-22:0','11:30-21:0'],
        'Tuesday':  ['11:0-20:0', '11:30-22:0','11:30-22:0'],
        'Wednesday':  ['11:0-20:0', '11:30-22:0','11:30-21:0'],
        'Thursday':  ['11:0-20:0', '11:30-22:0','11:30-21:0'],
        'Friday':  ['11:0-22:0', '11:30-22:0','11:30-21:0'],
        'Saturday':  ['11:0-22:0', '0:0-0:0',0],
        'Sunday':  ['11:0-17:0', '16:30-21:30','11:30-21:0',],

        }

df = pd.DataFrame (data, columns = ['restaurant_id','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday',])

实现此目的的简单语法是什么?

(语法上)最简单的方法之一是对 Saturday 列的元素应用 lambda 函数:

df["is_OpenSaturday"] = df["Saturday"].apply(lambda el: 0 if el in ('0:0-0:0', '0') else 1)

输出:

df["is_OpenSaturday"]
Out[5]: 
0    1
1    0
2    0
Name: is_OpenSaturday, dtype: int64

lambda 函数表示,如果其字符串值为“0:0-0:0”或“0”,则餐厅关闭 (return 0)。否则打开 (return 1).

请注意,必须在左侧使用 df["is_OpenSaturday"] = 而不是 df.is_OpenSaturday =is_OpenSaturday 列将仅使用 [] 运算符自动创建。

另请注意,efficiency-wise、.apply() 是您最后要尝试的选项。如果您有大量数据,list(map()) 结构通常更好。等效语法如下所示。

df["is_OpenSaturday"] = list(map(lambda el: 0 if el in ('0:0-0:0', '0') else 1, df["Saturday"]))

使用正则表达式检查 0:0-0:0 或任何以 zero

开头的字符串
df['is_OpenSaturday']=np.where(df.Saturday.str.contains('0\:0\-0\:0|^0'),0,1)

    restaurant_id      Monday     Tuesday   Wednesday    Thursday      Friday  \
0             1   11:0-20:0   11:0-20:0   11:0-20:0   11:0-20:0   11:0-22:0   
1             2  11:30-22:0  11:30-22:0  11:30-22:0  11:30-22:0  11:30-22:0   
2             3  11:30-21:0  11:30-22:0  11:30-21:0  11:30-21:0  11:30-21:0   

    Saturday       Sunday  is_OpenSaturday  
0  11:0-22:0    11:0-17:0                1  
1    0:0-0:0  16:30-21:30                0  
2          0   11:30-21:0                0  

使用str.findall

df.Saturday.str.findall(r'[^0:-]').astype(bool).astype(int)

Out[267]:
0    1
1    0
2    0
Name: Saturday, dtype: int32

或者

df.Saturday.str.findall(r'[1-9]').astype(bool).astype(int)

Out[276]:
0    1
1    0
2    0
Name: Saturday, dtype: int32