在dataframe python中创建子列

在dataframe python中创建子列,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个包含多列的数据框 df = pd.DataFrame({"cylinders":[2,2,1,1], "horsepower":[120,100,89,70], "weight":[5400,6200,7200,1200]}) cylinders horsepower weight 0 2 120 5400 1 2 100 6200 2 1

我有一个包含多列的数据框

df = pd.DataFrame({"cylinders":[2,2,1,1],
                  "horsepower":[120,100,89,70],
                  "weight":[5400,6200,7200,1200]})


 cylinders horsepower weight
0  2          120       5400
1  2          100       6200 
2  1           80       7200
3  1           70       1200
我想创建一个新的数据框,在用圆柱体凿取数据框时,用中间值和平均值制作两个子列的权重。 例如:

对于我的示例表,我使用了随机值。我无法做到这一点。 我知道如何得到中间值,也就是问题中描述的中间值。 :


但是如何创建这个子列呢?

下面的代码片段添加了两个请求的列。它按圆柱体对行进行分组,计算权重的平均值和中位数,并将原始数据帧和结果组合在一起:

result = df.join(df.groupby('cylinders')['weight']\
           .agg(['mean', 'median']))\
           .sort_values(['cylinders', 'mean']).ffill()
#   cylinders  horsepower  weight    mean  median
#2          1          80    7200  5800.0  5800.0
#3          1          70    1200  5800.0  5800.0
#1          2         100    6200  4200.0  4200.0
#0          2         120    5400  4200.0  4200.0

熊猫中的选定列不能有“子列”。如果一列有“subcolumns”,则所有其他列也必须有“subcolumns”。它被称为多重索引。

我可以通过多重索引得到这种结构吗,在多重索引中,我在顶部和中位数上有权重,在它下面有平均值?是的,你可以,但是你也必须有气缸和马力的二级索引。将这些列称为“平均重量”和“中间重量”可能更容易。
df.weight.median()
df.weight.mean()
df.groupby('cylinders') #groupby cylinders
result = df.join(df.groupby('cylinders')['weight']\
           .agg(['mean', 'median']))\
           .sort_values(['cylinders', 'mean']).ffill()
#   cylinders  horsepower  weight    mean  median
#2          1          80    7200  5800.0  5800.0
#3          1          70    1200  5800.0  5800.0
#1          2         100    6200  4200.0  4200.0
#0          2         120    5400  4200.0  4200.0