【问题标题】:Add a column in a pandas dataframe that is the average of another column based on conditions of other columns在 pandas 数据框中添加一列,该列是基于其他列条件的另一列的平均值
【发布时间】:2020-07-16 02:45:30
【问题描述】:

数据表太长,请见谅。我不知道一种更简洁的方法来构建我下面的数据框。

我有一个熊猫数据框:

data = {'ID': ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'],
        'Cycle': [1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4],
        'Repetition': ['1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '2', '2', '2', '2', '2', '2', '2', '2', '2', '2', '2', '2', '2', '2', '2', '2'],
        'Region': ['x', 'x','x','x','x','x','x','x', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'x','x','x','x','x','x','x','x', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y'],
        'Intensity': [34, 89, 34, 45, 34, 56, 78, 65, 45, 45, 34, 56, 34, 56, 56, 66, 56, 78, 23, 45, 42, 56, 86, 5, 33, 44, 78, 89, 34, 42, 34, 66]}


data_df= pd.DataFrame(data)

我想添加一个列,用于计算每个 ID(A 和 B)和每个区域(x 和 y)在 Cycle == 1 时的平均强度,并在所有其他行中保留 NaN 值。结果数据框将返回:

wanted_data = {'ID': ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'],
        'Cycle': [1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4],
        'Repetition': ['1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '2', '2', '2', '2', '2', '2', '2', '2', '2', '2', '2', '2', '2', '2', '2', '2'],
        'Region': ['x', 'x','x','x','x','x','x','x', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'x','x','x','x','x','x','x','x', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y'],
        'Intensity': [34, 89, 34, 45, 34, 56, 78, 65, 45, 45, 34, 56, 34, 56, 56, 66, 56, 78, 23, 45, 42, 56, 86, 5, 33, 44, 78, 89, 34, 42, 34, 66],
        'Mean Cycle1 Intensity': [39.5, '', '', '', 34, '', '', '', '', '', '', '', '', '', '', '', 44.5, '', '', '', 38, '', '', '', '', '', '', '', '', '', '', ''] }

wanted_data_df= pd.DataFrame(wanted_data)

我尝试添加一个函数:

def meanC1(df):
    for i in df['ID'] and j in df['Region']:
        if df['Cycle'] == 1:
            df['Mean Cycle1 Intensity'] = df['Intensity'].mean()

但这又回来了,

ValueError:Series 的真值不明确。使用a.empty, a.bool()、a.item()、a.any() 或 a.all()

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    使用Series.ne 创建一个布尔掩码 m,然后使用Series.mask 屏蔽m 上的Intensity 列,接下来使用Series.groupby 对屏蔽列进行分组在IDRepetitiontransform 上使用mean,最后再次使用Series.mask 来掩盖转换后的结果:

    # Note: Here df refers to `data_df`
    
    m = df['Cycle'].ne(1)
    df['Mean Cycle1 Intensity'] = (
        df['Intensity'].mask(m)
        .groupby([df['ID'], df['Repetition']]).transform('mean').mask(m)
    )
    

    结果:

       ID  Cycle Repetition Region  Intensity  Mean Cycle1 Intensity
    0   A      1          1      x         34                   39.5
    1   A      2          1      x         89                    NaN
    2   A      3          1      x         34                    NaN
    3   A      4          1      x         45                    NaN
    4   B      1          1      x         34                   34.0
    5   B      2          1      x         56                    NaN
    6   B      3          1      x         78                    NaN
    7   B      4          1      x         65                    NaN
    8   A      1          1      y         45                   39.5
    9   A      2          1      y         45                    NaN
    10  A      3          1      y         34                    NaN
    11  A      4          1      y         56                    NaN
    12  B      1          1      y         34                   34.0
    13  B      2          1      y         56                    NaN
    14  B      3          1      y         56                    NaN
    15  B      4          1      y         66                    NaN
    16  A      1          2      x         56                   44.5
    17  A      2          2      x         78                    NaN
    18  A      3          2      x         23                    NaN
    19  A      4          2      x         45                    NaN
    20  B      1          2      x         42                   38.0
    21  B      2          2      x         56                    NaN
    22  B      3          2      x         86                    NaN
    23  B      4          2      x          5                    NaN
    24  A      1          2      y         33                   44.5
    25  A      2          2      y         44                    NaN
    26  A      3          2      y         78                    NaN
    27  A      4          2      y         89                    NaN
    28  B      1          2      y         34                   38.0
    29  B      2          2      y         42                    NaN
    30  B      3          2      y         34                    NaN
    31  B      4          2      y         66                    NaN
    

    【讨论】:

    • 哇,从未听说过series.ne()。谢谢@shubham-sharma!
    • @SMadden 编码快乐!
    猜你喜欢
    • 2019-06-15
    • 1970-01-01
    • 2020-03-11
    • 1970-01-01
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    • 2019-06-05
    • 2021-08-25
    相关资源
    最近更新 更多