Pandas:从Weekday列值生成新列并填充时间出现计数
解决方法:用Pandas实现时间-星期几的次数统计
嘿,这需求用Pandas处理起来超顺手,给你两种实用的方法,都能精准得到你想要的结果:
方法1:使用pd.crosstab(交叉表,最直接的方案)
crosstab就是专门用来做这类行列交叉计数的工具,完美匹配你的需求:
import pandas as pd # 先构造你提供的示例DataFrame data = { 'Time': ['21:10:00', '21:15:00', '21:20:00', '21:20:00', '21:25:00', '21:25:00', '21:30:00', '21:35:00', '21:35:00', '21:40:00', '21:40:00', '21:40:00'], 'Weekday': ['Tuesday', 'Tuesday', 'Tuesday', 'Tuesday', 'Wednesday', 'Wednesday', 'Friday', 'Thursday', 'Wednesday', 'Wednesday', 'Wednesday', 'Monday'] } df = pd.DataFrame(data) # 生成交叉表,统计每个Time在各Weekday的出现次数 result = pd.crosstab(df['Time'], df['Weekday']) # 填充缺失值为0,转成整数类型,并调整列顺序匹配你的目标 weekday_order = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'] result = result.reindex(columns=weekday_order).fillna(0).astype(int) print(result)
运行后输出的结果就是你想要的格式:
Monday Tuesday Wednesday Thursday Friday Time 21:10:00 0 1 0 0 0 21:15:00 0 1 0 0 0 21:20:00 0 2 0 0 0 21:25:00 0 0 2 0 0 21:30:00 0 0 0 0 1 21:35:00 0 0 1 1 0 21:40:00 1 0 2 0 0
方法2:使用groupby + unstack(更灵活的分组方案)
如果你需要更灵活的分组操作,这种方法也能轻松实现:
# 基于Time和Weekday分组,统计每组的数量,再将Weekday转为列 result = df.groupby(['Time', 'Weekday']).size().unstack(fill_value=0) # 同样调整列顺序 weekday_order = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'] result = result.reindex(columns=weekday_order) print(result)
这个方法的输出和上面完全一致,适合后续还要做其他分组操作的场景。
关键细节说明:
reindex(columns=weekday_order):因为Pandas默认会按字母顺序排列列,我们手动指定顺序才能匹配你要的Monday到Friday的顺序fill_value=0/fillna(0):确保那些某个Time没在对应Weekday出现的位置显示0,而不是空值astype(int):把计数结果转成整数,让输出更整洁
内容的提问来源于stack exchange,提问作者 Ben Kailon
相关产品推荐
相关产品推荐

