Python Pandas多CSV列值过滤及代码语法错误求助
美国共享单车数据分析问题答疑
背景说明
咱们手头有三个城市的共享单车CSV数据,对应关系存在这个字典里:
CITY_DATA = { 'chicago': 'chicago.csv','new york city': 'new_york_city.csv','washington': 'washington.csv' }
需求是让用户指定城市、月份、日期来做数据分析,还得用while循环处理非法输入,确保用户选的是合法城市。
问题1:高效过滤CSV数据(告别一堆if/elif)
问题详情
怎么根据用户输入的城市、月份、日期,高效过滤这三个CSV的对应数据?实在不想写一堆if/elif去处理所有城市、12个月份或者7天。
解决方案
咱们可以用Pandas的布尔索引+时间处理来实现通用过滤,步骤很清晰:
- 加载对应城市数据:直接靠
CITY_DATA字典映射拿文件路径,根本不用判断城市:city_input = input("输入城市:").lower() df = pd.read_csv(CITY_DATA[city_input]) - 处理时间列:先把
Start Time转成datetime类型,这样提取月份、星期就超方便:df['Start Time'] = pd.to_datetime(df['Start Time']) df['month'] = df['Start Time'].dt.month # 月份用1-12的数字表示 df['day_of_week'] = df['Start Time'].dt.day_name() # 直接拿到星期名称,比如"Monday" - 通用过滤逻辑:
- 先定义合法的月份/星期列表(可以让用户输入名称或数字,统一转成标准格式就行)
- 用布尔索引直接过滤,完全不用逐个判断:
import calendar # 用来做月份名称和数字的转换,可选 # 示例:用户输入月份(比如"January")和星期(比如"Friday") target_month = input("输入月份(英文全称):").lower() target_day = input("输入星期(英文全称):").lower() # 把月份名称转成数字(如果用户输入数字的话直接用就行) month_map = {v.lower():k for k,v in enumerate(calendar.month_name[1:],1)} target_month_num = month_map[target_month] # 一键过滤数据 filtered_df = df[(df['month'] == target_month_num) & (df['day_of_week'].str.lower() == target_day)]
这样不管用户选哪个城市、哪个月份或星期,都用一套逻辑处理,再也不用写密密麻麻的分支判断了。
问题2:修复获取城市输入的SyntaxError
报错原因分析
你给的代码出现SyntaxError: 'return' outside function,问题出在这几点:
if/elif/else代码块没缩进,不在get_city()函数里面,导致return跑到函数外面去了- 函数内部多了一行
Enter a city: san jose,这应该是你测试的输入,不是代码内容 return的是变量名(比如chicago),但咱们应该返回城市名称字符串,对应CITY_DATA的键
修正后的完整代码
import time import pandas as pd import numpy as np import calendar CITY_DATA = { 'chicago': 'chicago.csv', 'new york city': 'new_york_city.csv', 'washington': 'washington.csv' } def get_city(): print("Hello! Let's explore some US bikeshare data! \n Which city would you like? \n Chicago, New York City or Washington? ") cities = ['chicago', 'new york city', 'washington'] while True: # 用while循环死磕,直到用户输入合法城市 city = input('Enter a city: ').lower() # 统一转小写,避免大小写坑 if city in cities: return city # 返回城市名称字符串,方便后续拿文件路径 else: print("Oops, that's not a valid city! Please choose from Chicago, New York City or Washington.") # 测试一下函数 selected_city = get_city() print(f"You selected: {selected_city.title()}")
修正的关键要点:
- 把
if/elif/else块正确缩进,放到get_city()函数内部 - 加了
while True循环,用户输错就一直提示,直到输入合法 - 把用户输入统一转成小写,避免因为大小写(比如输入"Chicago")导致判断失败
- 直接判断输入是否在
cities列表里,不用写一堆elif - 返回的是城市名称字符串(比如
'chicago'),后续直接用CITY_DATA[selected_city]就能拿到对应的CSV路径
附:chicago.csv前5行参考数据
Start Time,End Time,Trip Duration,Start Station,End Station,User Type,Gender,Birth Year 2017-05-29 18:36:27,2017-05-29 18:49:27,780,Columbus Dr & Randolph St,Federal St & Polk St,Subscriber,Male,1991.0 2017-06-12 19:00:33,2017-06-12 19:24:22,1429,Kingsbury St & Erie St,Orleans St & Merchandise Mart Plaza,Customer,, 2017-02-13 17:02:02,2017-02-13 17:20:10,1088,Canal St & Madison St,Paulina Ave & North Ave,Subscriber,Female,1982.0 2017-04-24 18:39:45,2017-04-24 18:54:59,914,Spaulding Ave & Armitage Ave,California Ave & Milwaukee Ave,Subscriber,Male,1966.0 2017-01-26 15:36:07,2017-01-26 15:43:21,434,Clark St & Randolph St,Financial Pl & Congress Pkwy,Subscriber,Female,1983.0
内容的提问来源于stack exchange,提问作者Jasch
相关产品推荐
相关产品推荐

