gpt4 book ai didi

python - 转换多索引数据帧以保留 groupby() 聚合

转载 作者:行者123 更新时间:2023-12-01 09:09:00 24 4
gpt4 key购买 nike

问题:

我的数据框有多列,其中包含按品牌分组的某些产品的信息。每个产品都有一些属性,如第 1 列、第 2 列等所示。这些列各自捕获子列 min、max 和 all 中的附加信息。分组的方式是品牌和型号形成数据框的多重索引

                          column 1       column 2      column 3      
brand model min max all min max all min max all min max all

brand(1) model(1)
model(2)
model(3)

brand(2) model(1)
. model(2)
. model(3)
. .
brand(n)

我需要向该数据框添加一个名为第 4 列的新列,该列需要拥有相同的子列 minmaxall 并且必须是数据帧的长度。

尝试过:

以下代码创建一个原始数据帧长度的数据帧,其中包含列 new_column 及其各自的子列 minmax全部

columns_to_add = pd.DataFrame(index= range(len(original_df.index)), columns =  ["new_column","new_column","new_column"],["min","max","all"]])
original_df = original_df.append(columns_to_add)

但是,当我可视化原始数据框时,我似乎失去了最初的分组并得到了类似的东西。

                          column 1      column 2       column 3     new_column
min max all min max all min max all min max all

(brand(1),model(1))
(brand(1),model(2))
(brand(1),model(3))

(brand(2),model(1))
(brand(2),model(2))
(brand(2),model(3))
.
.
(brand(n),model(i))
.
1410 NaN NaN NaN NaN NaN NaN NaN NaN NaN
1411 NaN NaN NaN NaN NaN NaN NaN NaN NaN
1412 NaN NaN NaN NaN NaN NaN NaN NaN NaN

我不明白这些从 1410 开始的额外行从何而来。我相信是取消分组造成的,因此它用 NaN 填充了这些行。

问题:

  1. 有没有办法以保留分组的方式添加new_column
  2. 如何处理这些填充了 NaN 的新行?

编辑:

[1] 我刚刚意识到我的原始数据帧有 1440 行,而包含空行的新数据帧有 2880 行长,换句话说,是原始数据帧长度的两倍。是什么导致行数加倍?

[2] 如何在多索引数据帧上执行 transform() 以保留 groupby?这将防止我的数据帧的行数加倍

最佳答案

要回答您的主要问题,可以使用 MultiIndex.from_product 添加带有子列的新多级列。一些测试数据来说明该过程:

df = pd.DataFrame({'brand': [1,1,1,1,2,2,2,2], 'model': [3,3,4,4,5,5,5,6], 'col1': [1,2,3,4,5,6,7,8], 'col2': [9,8,7,6,5,4,3,2]})
df = df.groupby(['brand', 'model']).agg({'col1': ['min', 'max', 'mean'], 'col2': ['min', 'max', 'mean']})

给出:

                col1          col2
min max mean min max mean
brand model
1 3 1 2 1.5 8 9 8.5
4 3 4 3.5 6 7 6.5
2 5 5 7 6.0 3 5 4.0
6 8 8 8.0 2 2 2.0

添加新的多级列:

df = df.join(pd.DataFrame(np.random.rand(len(df),3),
columns=pd.MultiIndex.from_product([['new_column'], ['min','max','mean']]),
index=df.index))

这里使用np.random.rand(len(df),3)来填充值,但只要尺寸正确就可以使用任何值。此处不使用任何内容会将新列中的值设置为 NaN

结果:

                col1          col2            new_column
min max mean min max mean min max mean
brand model
1 3 1 2 1.5 8 9 8.5 0.065094 0.489666 0.476452
4 3 4 3.5 6 7 6.5 0.280267 0.237083 0.272776
2 5 5 7 6.0 3 5 4.0 0.650988 0.384788 0.486176
6 8 8 8.0 2 2 2.0 0.025630 0.908280 0.386871

关于python - 转换多索引数据帧以保留 groupby() 聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51818691/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com