小能豆

Pandas 将列分解为行

py

我有一个 DataFrame,其中每行有两列:日期和提及。最终结果将是每个日期的提及的 Dataframe,如果我可以分解提及,通过 GroupBy 应该很容易,这就是我遇到的问题。原始数据如下所示:

date        mentions
2018-01-01  alpha, beta, gamma
2018-01-01  alpha
2018-01-02  beta
2018-01-03  delta
2018-01-05  alpha
2018-01-07  alpha
2018-01-10  delta, gamma
2018-01-11  gamma

我需要将其转换为:

date        mentions
2018-01-01  alpha
2018-01-01  beta
2018-01-01  gamma
2018-01-01  alpha
2018-01-02  beta
2018-01-03  delta
2018-01-05  alpha
2018-01-07  alpha
2018-01-10  delta
2018-01-10  gamma
2018-01-11  gamma

最终状态应如下所示,我可以通过 GroupBy 值计数(加上重新索引)来获得:

date        alpha     beta     gamma     delta
2018-01-01  2         1        1         0
2018-01-02  0         1        1         0
2018-01-03  0         0        0         1
2018-01-04  0         0        0         0
2018-01-05  1         0        0         0
2018-01-06  0         0        0         0
2018-01-07  1         0        0         0
2018-01-08  0         0        0         0
2018-01-09  0         0        0         0
2018-01-10  0         0        1         1
2018-01-11  0         0        1         0

我在其他地方看到过这个问题的变体,但与我的不太一样,我觉得它非常简单,我只是没有看到正确的解决方案。


阅读 49

收藏
2024-11-21

共1个答案

小能豆

你可以通过以下步骤实现你想要的结果:

  1. mentions 列中的逗号分隔的字符串拆分为单独的提及。
  2. 展开拆分后的列表为多行。
  3. 使用 GroupBysize 来统计每个日期的每个提及的频率。

下面是实现的步骤:

代码实现:

import pandas as pd

# 原始数据
data = {
    'date': ['2018-01-01', '2018-01-01', '2018-01-02', '2018-01-03', '2018-01-05', '2018-01-07', '2018-01-10', '2018-01-11'],
    'mentions': ['alpha, beta, gamma', 'alpha', 'beta', 'delta', 'alpha', 'alpha', 'delta, gamma', 'gamma']
}

# 创建 DataFrame
df = pd.DataFrame(data)

# 将 mentions 列中的字符串按逗号拆分并展开成多行
df_expanded = df.set_index('date').mentions.str.split(', ', expand=True).stack().reset_index(name='mention')

# 计算每个日期的每个提及的计数
result = df_expanded.groupby(['date', 'mention']).size().unstack(fill_value=0)

# 查看结果
print(result)

输出结果:

mention      alpha  beta  delta  gamma
date                                   
2018-01-01      2     1      0      1
2018-01-02      0     1      0      0
2018-01-03      0     0      1      0
2018-01-05      1     0      0      0
2018-01-07      1     0      0      0
2018-01-10      0     0      1      1
2018-01-11      0     0      0      1

解释:

  1. 拆分 mentions: 使用 str.split(', ') 将每个提及按逗号分开,这样每个日期的提及就变成了一个列表。
  2. 展开为多行: 使用 stack() 将拆分后的数据转换为多行,每个提及都对应一行。
  3. 计数并重新排列: 使用 groupby(['date', 'mention']).size() 来计算每个日期每个提及的出现次数,最后使用 unstack()mention 列转为列名,并填充缺失的值(填充为 0)。

这种方法既高效又简洁,适用于你的需求。

2024-11-21