在 groupby 和 get_group 之后更新 df 中的值

问题描述 投票:0回答:1

我有一个以下形式的数据框

df = pd.DataFrame({'dim_unit' :['m', 'cm', 'cm', 'm', 'ft', 'in'], 'Length' : [1,2,3,4,5,6], 'Width' : [5,6,7,8,9,10] }) 

我尝试使用 groupby 按不同的维度单位进行分组,然后获取子数据帧,对每个“长度”和“宽度”列应用比例因子,以便生成的数据帧具有相同的维度。 (实际的有更多单位和要转置的列)。

以下内容有效,除了我无法让它在原始数据框中更新它(显然再次重复“高度”和“米”等)。

df.groupby('dim_unit')
df.get_group('cm')[["Width"]].apply( lambda x: x*100)

我尝试使用转换而不是应用,但这似乎没有改变任何东西。我也试过了

df['len_cm_to_m']= df.get_group('cm')[["Width"]].apply( lambda x: x*100)

但这会导致一列中有很多 Nan,然后我必须对厘米、英寸、英尺等中的每一个重复,并将这些值合并到一列转换单位中。 特别是,因为我按大约 5 种不同类型的单元进行分组,并且每个单元的每个应用函数都不同,然后我正在处理多个列,所以这将为我的整个数据集创建 15 个新列有很多 Nan 值,然后我需要合并它们,这看起来很混乱。

那么,有没有办法从结果 apply 函数中更新 df 中的值?理想情况下,这将是值的更新。或者我也在考虑尝试使用合并(或类似的)通过匹配索引来更新列?

对此的任何建议都非常感谢!

pandas dataframe group-by merge transform
1个回答
0
投票

不需要分组,只需将单位按比例

map
,然后相乘即可:

conversion_dict = {
    "m": 100,
    "cm": 1,
    "ft": 12 * 2.54,
    "in": 2.54
}

df[['Length','Width']] = df[['Length','Width']].mul(df['dim_unit'].map(conversion_dict), axis=0)

输出:

  dim_unit  Length   Width
0        m  100.00  500.00
1       cm    2.00    6.00
2       cm    3.00    7.00
3        m  400.00  800.00
4       ft  152.40  274.32
5       in   15.24   25.40
© www.soinside.com 2019 - 2024. All rights reserved.