Pandas: 如何过滤Dataframe中的列信息并进行不同的处理
Pandas: How to filter column information in Dataframe and process it differently
我有一个数据框表示一周内一些餐厅的时间表。
- 我想做的是在我的初始 Dataframe
df
中添加一列 is_OpenSaturday
表示餐厅是否在星期六营业(布尔值:0 或 1 )
注意:值0
或0: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
我有一个数据框表示一周内一些餐厅的时间表。
- 我想做的是在我的初始 Dataframe
df
中添加一列is_OpenSaturday
表示餐厅是否在星期六营业(布尔值:0 或 1 )
注意:值0
或0: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