【问题标题】:Adding a column in a dataframe doing different operation for different rows of existing column在数据框中添加一列,对现有列的不同行执行不同的操作
【发布时间】:2020-05-01 21:06:22
【问题描述】:
FOOD_ID   SAMPLE_NO   ELEMENT1   ELEMENT2   ELEMENT3
 F110       A1          0.4        0.2        0.1
 F110       A2          0.6        0.1        0.3
 F110       B1          0.4        0.3        0.7
 F110       B2          0.5        0.6        0.9
 F110       C1          0.5        0.3        0.4
 F110       C2          0.6        0.2        0.6
 F110       C3          0.1        0.1        0.5
 F120       B1          0.4        0.2        0.2
 F120       B2          0.5        0.2        0.5
 F120       B3          0.7        0.3        0.8
 F120       B4          0.7        0.7        0.9
 F120       B5          0.2        0.9        0.1

我的数据如上所示。我想添加列,为食物 ID 提供元素 1、2、3 的平均值。 如果样本 C 可用,则平均值将只是 C 样本的平均值,如果 C 样本不存在,则平均值将只是 B 样本的最新。

对于食品 f110 C 样品存在,这就是为什么平均值将为 C 样品的平均值。 对于食品 f120 C 样品不存在,这就是为什么平均值将是最新的 B 样品,B5。

我最终想要的数据框如下所示...

FOOD_ID   ELEMENT1_AVG          ELEMENT2_AVG       ELEMENT3_AVG
F110     (0.5+0.6+0.1)/3=0.4  (0.3+0.2+0.1)=0.2  (0.4+0.6+0.5)=0.5
F120         0.2                    0.9               0.1

需要帮助。 提前致谢。

【问题讨论】:

    标签: python pandas dataframe duplicates mean


    【解决方案1】:

    您可以通过Series.str.startswith 获得带有C 的行掩码,最后一个B 第一次测试如果不存在C 每组使用GroupBy.transformGroupBy.anym 并通过@ 反转掩码987654333@,与b 链接并通过df[(~m & b)] 过滤,然后通过Series.duplicated 与invert ~ 获得最后一个B

    然后过滤原始DataFramecSeries.combine_first 并聚合mean,因为B 是每个组只有一行它返回相同的值:

    c = df['SAMPLE_NO'].str.startswith('C')
    b = df['SAMPLE_NO'].str.startswith('B')
    m = c.groupby(df['FOOD_ID']).transform('any')
    
    mask = ~df[(~m & b)].duplicated(subset=['FOOD_ID'], keep='last')
    df1 = (df[mask.combine_first(c)]
                  .groupby('FOOD_ID')
                  .mean()
                  .add_suffix('_AVG')
                  .reset_index())
    print (df1)
      FOOD_ID  ELEMENT1_AVG  ELEMENT2_AVG  ELEMENT3_AVG
    0    F110           0.4           0.2           0.5
    1    F120           0.2           0.9           0.1
    

    【讨论】:

      猜你喜欢
      • 2022-12-13
      • 1970-01-01
      • 1970-01-01
      • 2019-09-13
      • 1970-01-01
      • 2023-04-06
      • 2022-07-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多