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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 06:44:14