Pandas如何按天和按小时对情感列执行多数投票统计
实现步骤
1. 修正数据集复现代码
你提供的原始复现代码存在语法错误,修正后可直接运行的版本如下:
import pandas as pd df = pd.DataFrame({ 'tweet_text': ['tweet1', 'tweet2', 'tweet3', 'tweet4', 'tweet5', 'tweet6', 'tweet7', 'tweet8', 'tweet9', 'tweet10'], 'date': ['2021-08-16', '2021-08-16', '2021-08-16', '2021-08-16', '2021-08-16', '2021-08-17', '2021-08-17', '2021:08:17', '2021:08:17', '2021:08:17'], 'time': ['11:53:37', '02:44:04', '02:44:02', '02:47:02', '02:50:00', '05:20:46', '06:01:00', '06:20:00', '07:05:00', '07:20:21'], 'sentiments': ['positive', 'neutral', 'neutral', 'neutral', 'negative', 'positive', 'positive', 'positive', 'negative', 'negative'] })
2. 数据预处理
原始数据中date列存在2021:08:17这类格式不统一的问题,同时需要提取小时维度,先做格式转换:
# 统一日期格式,转换为标准日期类型 df['date'] = df['date'].str.replace(':', '-').astype('datetime64[ns]').dt.date # 提取小时,生成HH:00格式的小时列 df['Hour'] = pd.to_datetime(df['time']).dt.strftime('%H:00')
3. 按天统计多数情感
核心逻辑是按日期分组后,对sentiments列取众数,iloc[0]用于处理平票场景,默认取第一个出现的众数:
df_daily = df.groupby('date')['sentiments']\ .agg(lambda x: x.mode().iloc[0])\ .reset_index(name='Majority_Sentiment')
运行后输出的df_daily和你要求的按天统计结果完全一致。
4. 按日期+小时统计多数情感
按两个维度分组后执行相同的众数计算逻辑即可:
df_hourly = df.groupby(['date', 'Hour'])['sentiments']\ .agg(lambda x: x.mode().iloc[0])\ .reset_index(name='Majority_Sentiment')
运行后输出的df_hourly和你要求的按小时统计结果完全一致。
注:如果需要自定义平票时的取值规则,比如返回全部众数、或者按优先级取特定类别,修改
lambda里的取值逻辑即可。
内容的提问来源于stack exchange,提问作者Woox
相关产品推荐
相关产品推荐

