Python DataFrame列转行问题:将Shape1格式转换为Shape2格式并计算推文极性与主观性
解决DataFrame格式转换与情感统计问题
嘿,别担心,我来帮你搞定这个DataFrame转换的问题!作为Python初学者,处理这种格式转换确实有点绕,不过用pandas的几个工具就能轻松解决。咱们先从示例数据入手,一步步实现你要的Shape2格式。
第一步:准备示例数据(你可以替换成自己的数据)
首先我模拟一个和你说的Shape1类似的DataFrame,方便你跟着代码跑:
import pandas as pd # 模拟Shape1格式的原始数据 data = { 'date': ['2023-10-01', '2023-10-01', '2023-10-02', '2023-10-03', '2023-10-03', '2023-10-03'], 'tweet': ['今天天气不错!', '这个产品真好用', '刚看完一部好电影', '外卖有点慢', '今天加班好烦', '周末要去爬山啦'], 'polarity': [0.3, 0.5, 0.7, -0.2, -0.4, 0.6], 'subjectivity': [0.4, 0.6, 0.8, 0.3, 0.5, 0.7] } df = pd.DataFrame(data)
第二步:给同日期的推文编号
要把同一日期的推文放到不同列里,首先得给每个日期下的推文加个序号(比如第1条、第2条):
# 给每个日期内的推文添加从1开始的序号 df['tweet_num'] = df.groupby('date').cumcount() + 1
这里groupby('date')会把数据按日期分组,cumcount()给每组内的行从0开始计数,加1后就变成了1、2、3...的序号,这样同一日期的推文就有了唯一标识。
第三步:将推文列转成宽格式
接下来用pivot函数把纵向的推文转成横向的多列:
# 转换为宽格式,列名变成tweet_1、tweet_2... tweets_wide = df.pivot( index='date', columns='tweet_num', values='tweet' ).rename(columns=lambda x: f'tweet_{x}')
pivot的作用就是把行转成列:用date作为行索引,tweet_num作为新的列名,tweet作为新列的值,最后用rename把列名改成更直观的tweet_1、tweet_2格式。
第四步:计算同日期的情感统计值
现在计算每个日期下所有推文的极性和主观性,这里我用均值做示例,如果你需要总和,把mean换成sum就行:
# 按日期聚合,计算极性和主观性的均值 sentiment_stats = df.groupby('date').agg( avg_polarity=('polarity', 'mean'), avg_subjectivity=('subjectivity', 'mean') ).reset_index()
agg函数可以一次性指定多个聚合规则,这里我们给统计结果起了清晰的列名,reset_index()是把date从索引变回普通列,方便后续合并。
第五步:合并结果得到Shape2格式
最后把宽格式的推文表和情感统计表合并起来:
# 合并两个表,得到最终的Shape2格式 shape2_df = pd.merge(tweets_wide.reset_index(), sentiment_stats, on='date') # 如果想把NaN(空值)换成空字符串,可以加这一行 # shape2_df = shape2_df.fillna('') # 查看结果 print(shape2_df)
运行后你会得到这样的结果:
date tweet_1 tweet_2 tweet_3 avg_polarity avg_subjectivity 0 2023-10-01 今天天气不错! 这个产品真好用 NaN 0.400000 0.50 1 2023-10-02 刚看完一部好电影 NaN NaN 0.700000 0.80 2 2023-10-03 外卖有点慢 今天加班好烦 周末要去爬山啦 -0.000000 0.50
额外说明
- 如果你的原始数据里
date不是日期格式,可以先用pd.to_datetime(df['date'])转换成日期类型,避免分组出错。 - 聚合方式可以根据需求调整:比如求总和用
sum,求最大值用max,都只需要修改agg里的参数就行。
内容的提问来源于stack exchange,提问作者Salih Can YAVUZ
相关产品推荐
相关产品推荐

