我有一个格式的dataframe df:
Grade Height Speed Value
0 A 13 0.1 500
1 B 25 0.3 100
2 C 54 0.6 200我想把它分组,这样我把等级作为指数,高度(分裂成桶)作为列,在单个单元格内有等级和高度组合的平均值。
因此,输出数据将如下所示:
Height
Grade 0-10 10-25 25-50 50-100
A avg(speed*value) x x x
B x x x x
C x x x x其中x是计算出的平均速度*值。
我尝试过这样的方法,但没有成功:
output = pd.DataFrame(data=df, index = df[df['Grade']], columns = df[df['Height']].groupby(pd.qcut(df['Height'], 3, duplicates='drop'))).groupby(df['Value')).mean()但是,我不太清楚哪种方法可能有效,不会抛出错误或空的df。
你有什么想法我可以试试吗?
发布于 2022-07-17 03:38:49
Speed * Value
pd.cut将Height列分解为回收箱。
mean是默认的支点函数。使用dropna=False使即使空回收箱也是shown.。
df.Height = pd.cut(df.Height, bins=[0, 10, 25, 50, 100])
df['speed_value'] = df.Speed.mul(df.Value)
out = df.pivot_table(index='Grade', columns='Height', values='speed_value', dropna=False)
print(out)输出:
Height (0, 10] (10, 25] (25, 50] (50, 100]
Grade
A NaN 50.0 NaN NaN
B NaN 30.0 NaN NaN
C NaN NaN NaN 120.0发布于 2022-07-17 04:05:42
使用:
df['agg'] = pd.cut(df['Height'].astype(int), [0,10,25,50,100])
s = df.pivot_table(index='Grade', columns='agg', values=['Speed', 'Value'], dropna=False)
s.apply(lambda x: [x[i]*x[i+4] for i in range(4)], axis = 1).apply(pd.Series).rename(columns = {i: s.columns.get_level_values(1).categories[i] for i in range(4)})输出:
(0, 10] (10, 25] (25, 50] (50, 100]
Grade
A NaN 50.0 NaN NaN
B NaN 30.0 NaN NaN
C NaN NaN NaN 120.0https://stackoverflow.com/questions/73008968
复制相似问题