【问题标题】:Adding a new column to a pandas dataframe based on data organised by groupby根据 groupby 组织的数据向 pandas 数据框添加新列
【发布时间】:2021-11-05 17:37:50
【问题描述】:

我有以下数据框:

>>> df.head()
   id                date seizure_type                  note date_column
0   4 2021-10-01 16:35:00         Mild                  None  2021-10-01
1   5 2021-10-02 16:45:00       Medium                   Wet  2021-10-02
2   6 2021-10-02 22:55:00       Medium                  None  2021-10-02
3   7 2021-10-03 08:30:00       Strong                  None  2021-10-03
4   8 2021-10-06 19:30:00       Strong  Been brewing all day  2021-10-06

我正在尝试计算每天每种癫痫发作类型的值,并使用此数据创建一个新列。以下产生了我需要的东西:

data = df.groupby(['date_column'])['seizure_type'].count()

date_column
2021-10-01    1
2021-10-02    2
2021-10-03    1
2021-10-06    1
2021-10-07    1

但我不知道如何将此数据作为新列添加到现有数据框中。

我尝试像这样添加列:

df['freq'] = data

但 freq 列不起作用并产生以下内容:

   id                date seizure_type                  note date_column  freq
0   4 2021-10-01 16:35:00         Mild                        2021-10-01   NaN
1   5 2021-10-02 16:45:00       Medium                   Wet  2021-10-02   NaN
2   6 2021-10-02 22:55:00       Medium                        2021-10-02   NaN
3   7 2021-10-03 08:30:00       Strong                        2021-10-03   NaN
4   8 2021-10-06 19:30:00       Strong  Been brewing all day  2021-10-06   NaN

我觉得答案正盯着我的脸,但我看不到它。

【问题讨论】:

  • 你能给出你想要的模型吗?将每日统计数据与每个单独的事件联系起来似乎很奇怪。

标签: python pandas pandas-groupby


【解决方案1】:

not_speshal 上面给出的答案最终并不是我想要的。我意识到我正在尝试将 groupby 对象转换为数据框,并发现最好的方法是使用 .to_frame 然后使用 .reset_index() 重置索引

frequency_count = df.groupby(['date_column'])['seizure_type'].value_counts().to_frame(name='frequency').reset_index()

【讨论】:

    【解决方案2】:

    使用transform:

    df["freq"] = df.groupby('date_column')['seizure_type'].transform("count")
    
    >>> df
       id                date seizure_type                  note date_column  freq
    0   4 2021-10-01 16:35:00         Mild                  None  2021-10-01     1
    1   5 2021-10-02 16:45:00       Medium                   Wet  2021-10-02     2
    2   6 2021-10-02 22:55:00       Medium                  None  2021-10-02     2
    3   7 2021-10-03 08:30:00       Strong                  None  2021-10-03     1
    4   8 2021-10-06 19:30:00       Strong  Been brewing all day  2021-10-06     1
    

    顺便说一句,您创建的“date_column”列似乎只是为了在groupby 中使用。您不需要 这样做。你可以简单地使用:

    df["freq"] = df.groupby(df["date"].dt.date)['seizure_type'].transform("count")
    
    >>> df
       id                date seizure_type                  note  freq
    0   4 2021-10-01 16:35:00         Mild                  None     1
    1   5 2021-10-02 16:45:00       Medium                   Wet     2
    2   6 2021-10-02 22:55:00       Medium                  None     2
    3   7 2021-10-03 08:30:00       Strong                  None     1
    4   8 2021-10-06 19:30:00       Strong  Been brewing all day     1
    

    【讨论】:

    • 太棒了,谢谢!我是熊猫新手,完全被卡住了。
    • 很高兴帮助@PeterColes! :)
    猜你喜欢
    • 1970-01-01
    • 2021-06-20
    • 1970-01-01
    • 2021-03-02
    • 2020-02-24
    • 2017-01-14
    • 2018-12-29
    • 1970-01-01
    • 2019-04-04
    相关资源
    最近更新 更多