根据ID和条件计算平均值

时间:2020-06-09 21:41:49

标签: python pandas-groupby

这是我的数据框:

       ID  Tell  Number 
0       1   Yes     3   
1       1   Yes     6
2       1   No      9
3       2   Yes     4
4       2   Yes     7
5       2   No      8
6       3   Yes     15
7       3   Yes     8
8       3   No      6
9       3   Yes     13

# Creating the dictionary
dic = {'ID': [1,1,1,2,2,2,3,3,3,3], 'Tell': ['Yes', 'Yes', 'No', 'Yes','Yes', 'No','Yes', 'Yes','No', 'Yes'], 'Number': [3,6,9,4,7,8,15,8,6,13]}

# Creating the dataframe
df = pd.DataFrame(dic)

我想创建一个第四列,该列为我提供每个ID的平均值。仅当Tell列为Yes时,该行才用于平均值计算。

因此,我得到的df应该看起来像这样:

       ID  Tell  Number mean
0       1   Yes     3    4.5
1       1   Yes     6    4.5
2       1   No      9    4.5
3       2   Yes     4    5.5
4       2   Yes     7    5.5
5       2   No      8    5.5
6       3   Yes     15   12
7       3   Yes     8    12
8       3   No      6    12
9       3   Yes     13   12

我正在考虑在ID列上进行分组,然后检查Tell列中是否存在Yes或No。我不确定如何实现这一点。

请帮助

1 个答案:

答案 0 :(得分:0)

import pandas as pd

# Creating the dictionary
dic = {'ID': [1,1,1,2,2,2,3,3,3,3], 'Tell': ['Yes', 'Yes', 'No', 'Yes','Yes', 'No','Yes', 'Yes','No', 'Yes'], 'Number': [3,6,9,4,7,8,15,8,6,13]}

# Creating the dataframe
df = pd.DataFrame(dic)

df = (pd.merge(left=df, right=df[df.Tell == 'Yes'].groupby('ID')['Number'].mean(), on='ID')
        .rename(columns={'Number_x':'Number', 'Number_y':'mean'}))

print(df)

打印:

   ID Tell  Number  mean
0   1  Yes       3   4.5
1   1  Yes       6   4.5
2   1   No       9   4.5
3   2  Yes       4   5.5
4   2  Yes       7   5.5
5   2   No       8   5.5
6   3  Yes      15  12.0
7   3  Yes       8  12.0
8   3   No       6  12.0
9   3  Yes      13  12.0