如何在对ID进行分组的同时,在另一列的情况下创建一个平均值为1列的新数据帧

2024-10-02 04:29:19 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,我有以下数据框:

In [1]:
import pandas as pd
import numpy as np

df = pd.DataFrame([['0068edf090ceaf1356', '0068edf090ceaf1356', '0068edf090ceaf1356','0068edf090ceaf1356', '0068edf090ceaf1356', '009eft67eaa133cea4', '009eft67eaa133cea4', '009eft67eaa133cea4', '009eft67eaa133cea4'], [-26, -26 -36, 81, 181, -51, -81, 61, 71], [18.0, 27.0, 53.0, 43.6, 12.4, 24.4, 63.0,72.8]], columns = ['uuid', 'prom_completed_date', 'prom_score'])  

In [2]: df
Out[2]: 
         uuid       prom_completed_date        prom_score
0068edf090ceaf1356          -26                    18.0
0068edf090ceaf1356          -26                    18.0
0068edf090ceaf1356          -36                    27.0
0068edf090ceaf1356           81                    53.0
0068edf090ceaf1356          181                    43.6 
009eft67eaa133cea4          -51                    12.4
009eft67eaa133cea4          -81                    24.4
009eft67eaa133cea4           61                    63.0
009eft67eaa133cea4           71                    72.8

每个患者都有多个条目。请记住,前两个条目不是重复条目,但与其他具有不同选项的列相同,因此,操作前平均值不是(18+18+27)/3,而是(18+27)/2

我想创建一个新的数据帧,其中每个uuid有三个新列:

  • 平均PROM分数,其中PROM_completed_date_relative中的值为负值
  • 平均PROM分数,其中PROM_completed_date_relative中的值为正值
  • 上述两个平均值之间的差异

我不确定如何在python中进行编码,同时确保uuid分组

我在找这样的东西:

In [3]:
Out[3]:
      uuid            postop_avgPROM    preop_avgPROM    difference
0068edf090ceaf1356          48.3             22.5           25.8
009eft67eaa133cea4          67.9             18.4           49.5

我尝试了以下方法:

df.query("prom_completed_date_relative">0).groupby("uuid")["prom_score"].mean().reset_index(name="postop_avgPROM_score")

但不幸的是,它似乎不起作用

多谢各位


Tags: 数据inimportdfdateuuidas条目
2条回答

以下是您尝试的解决方案

这将为uuid值和prom_completed_date_relative正/负的每个组合提供prom_score平均值

df_avg = df.groupby(["uuid",df["prom_completed_date_relative"]>=0])["prom_score"].mean().reset_index()

您将需要对其进行更多的处理,以获得所需的列

df_avg上使用.pivot()

df_avg = df_avg.pivot(index="uuid", columns="prom_completed_date_relative" ,values="prom_score")

可能有一种更简洁的方法来实现您的结果,但这里有一种非常明确的多步骤方法

#get each column
post_op=df[df['prom_completed_date']>0].groupby('uuid').mean()['prom_score']
pre_op=df[df['prom_completed_date']<0].groupby('uuid').mean()['prom_score']
difference=post_op-pre_op

#concat them together
df1=pd.concat([post_op,pre_op,difference], axis=1)

#rename the columns
df1.columns=['postop_avgPROM','preop_avgPROM','difference']

df1
                    postop_avgPROM  preop_avgPROM   difference
uuid            
0068edf090ceaf1356  48.3            22.5            25.8
009eft67eaa133cea4  67.9            18.4            49.5

相关问题 更多 >

    热门问题