You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的布尔索引+时间处理来实现通用过滤,步骤很清晰:

  1. 加载对应城市数据:直接靠CITY_DATA字典映射拿文件路径,根本不用判断城市:
    city_input = input("输入城市:").lower()
    df = pd.read_csv(CITY_DATA[city_input])
    
  2. 处理时间列:先把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"
    
  3. 通用过滤逻辑:
    • 先定义合法的月份/星期列表(可以让用户输入名称或数字,统一转成标准格式就行)
    • 用布尔索引直接过滤,完全不用逐个判断:
      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()}")

修正的关键要点:

  1. 把if/elif/else块正确缩进,放到get_city()函数内部
  2. 加了while True循环,用户输错就一直提示,直到输入合法
  3. 把用户输入统一转成小写,避免因为大小写(比如输入"Chicago")导致判断失败
  4. 直接判断输入是否在cities列表里,不用写一堆elif
  5. 返回的是城市名称字符串(比如'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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:07:56