首页 > 解决方案 > 无法根据 python 中的用户输入从 csv 表中过滤数据

问题描述

我有一个看起来像这样的示例 csv 表

  Start Time         End Time       Trip Duration    Start Station   End Station 
  01/01/17 15:09    01/01/17 15:14     321           A               B
  01/02/17 15:09    01/02/17 15:14     321           C               D
  12/03/17 15:09    12/03/17 15:14     321           E               F
  05/01/17 15:09    05/01/17 15:14     321           B               D
  17/02/17 15:09    17/02/17 15:14     321           C               F
  12/04/17 15:09    12/04/17 15:14     321           E               H
  13/05/17 15:09    13/05/17 15:14     321           S               K
  17/01/17 15:09    17/01/17 15:14     321           A               D

我可以使用以下代码读取上述文件并获取月份和日期的值

df = pd.read_csv(sample.csv)
df['month'] = df['Start Time'].dt.month
df['day_of_week'] = df['Start Time'].dt.weekday_name

但是我有一个要求,要求用户输入月份或日期,然后根据用户输入的这些值,需要创建一个新数据,在该数据上将执行进一步的操作。

例如:如果用户输入一月,那么开始时间中的月份是一月,则显示与此相关的数据。新数据应该是这样的

  Start Time         End Time       Trip Duration    Start Station   End Station 
 01/01/17 15:09   01/01/17 15:14       321           A               B
 05/01/17 15:09   05/01/17 15:14       321           B               D
 17/01/17 15:09   17/01/17 15:14       321           A               D

如果用户输入一天,例如星期一假设星期一的日期是 12),那么 o/p 应该是这样的

  Start Time         End Time       Trip Duration    Start Station   End Station 
12/03/17 15:09     12/03/17 15:14      321           E               F
12/04/17 15:09     12/04/17 15:14      321           E               H

然后在这些新表上需要进行进一步的操作/计算。

谁能告诉如何创建这个新的过滤数据

标签: pythonpandasdataframe

解决方案


一种方法是使用该calendar模块获取月份和星期名称列表,然后使用简单的if else语法通过用户输入过滤您的数据框:

import calendar

# Start by converting start time to proper datetime format:
df['Start Time'] = pd.to_datetime(df['Start Time'])

months = list(calendar.month_name)
days = list(calendar.day_name)

user_in = input('What do you want to filter by? ')

if user_in in months:
    filtered = df[df['Start Time'].dt.strftime('%B').eq(user_in)]
elif user_in in days:
    filtered = df[df['Start Time'].dt.strftime('%A').eq(user_in)]
else:
    print('Invalid Input')

user_in是一月,那么filtered数据框看起来像:

>>> filtered
           Start Time        End Time  Trip Duration Start Station End Station
0 2017-01-01 15:09:00  01/01/17 15:14            321             A           B
1 2017-01-02 15:09:00  01/02/17 15:14            321             C           D
7 2017-01-17 15:09:00  17/01/17 15:14            321             A           D

如果user_in是星期一:

>>> filtered
           Start Time        End Time  Trip Duration Start Station End Station
1 2017-01-02 15:09:00  01/02/17 15:14            321             C           D
3 2017-05-01 15:09:00  05/01/17 15:14            321             B           D
5 2017-12-04 15:09:00  12/04/17 15:14            321             E           H

推荐阅读