Python 基于列的堆栈数据
我在python中,我有一个这样的数据框,包含sub_id指的是患者id,hour_度量值从1到22,以及其他患者的度量值Python 基于列的堆栈数据,python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,我在python中,我有一个这样的数据框,包含sub_id指的是患者id,hour_度量值从1到22,以及其他患者的度量值 subject_id | hour_measure heart rate | urinecolor | blood pressure -------------------------------------------------------- 3 | 1
subject_id | hour_measure heart rate | urinecolor | blood pressure
--------------------------------------------------------
3 | 1 40 | red | high
3 | 2 60 | red | high
3 | .. .. | .. | ..
3 | 22 90 | red | high
4 | 3 60 | yellow | low
4 | 3 60 | yellow | low
4 | 22 90 | red | high
我想根据最大最小偏差等对数字特征和分类的第一个和最后一个值的子_id测量进行分组
我写下面的代码
df= pd.read_csv(path)
df1 = (df.groupby(['subject_id','hour_measure'])
.agg([ 'sum','min','max', 'median','var','skew']))
f = lambda x: next(iter(x.mode()), None)
cols = df.select_dtypes(object).columns
df2 = df.groupby(['subject_id','hour_measure'])[cols].agg(f)
df2.columns = pd.MultiIndex.from_product([df2.columns, ['mode']])
print (df2)
df3 = pd.concat([df1, df2], axis=1).unstack().reorder_levels([0,2,1],axis= 1)
print (df3)
df3.to_csv("newfile.csv")
它给了我每小时的分组
我试着只使用主题id将其分组
df1 = (df.groupby(['subject_id'])
.agg([ 'sum','min','max', 'median','var','skew']))
它也给我相同的输出,并计算每小时的统计数据,如下所示
subject_id | heart rate_1 | heartrate_2 ....
--------------------------------------------------------
| min max mean | min max mean ....
3
4
我希望输出如下所示
subject_id | heart rate | repiratotry rate |urine color
--------------------------------------------------------
| min | max | mean | min | max | mean ..|. first | last
3 50 60 55 40 65 20 | yellow | red
任何人都可以告诉我如何编辑代码以提供所需的输出
任何帮助都将不胜感激如果这能让你接近你想要的东西,请告诉我。我没有遇到你每小时分组的问题,所以我不确定我是否完全理解你的问题
#示例数据帧
df=pd.DataFrame(
{
“受试者id”:[1,1,1,2,2,3,3,3],
“小时度量”:[1,22,12,5,18,21,8,18,4],
“血压”:[
“高”,
“高”,
“高”,
“高”,
“低”,
“低”,
“低”,
“低”,
“高”,
],
}
)
#在聚合数值列之前对其进行排序
数值结果=(
df.选择类型(include=“number”)
.groupby([“主题id”])
.agg([“最小”、“最大”、“平均值”])
)
#在聚合分类列之前对其进行排序
分类结果=(
df.set_索引([“主题id”])
.选择类型(include=“object”)
.groupby([“主题id”])
.agg([“第一个”、“最后一个”])
)
#结合数字和分类结果
结果=数值结果。联接(分类结果)
对不管数据量多大,它都能在短时间内满足我的需求,谢谢。。
hour_measure blood_pressure
min max mean first last
subject_id
1 1 22 11.666667 high high
2 5 21 14.666667 high low
3 4 18 10.000000 low high