Python 添加一个新的数据帧列,并用条件计算填充它(平均值if、标准偏差if)

Python 添加一个新的数据帧列,并用条件计算填充它(平均值if、标准偏差if),python,pandas,function,conditional-statements,std,Python,Pandas,Function,Conditional Statements,Std,我需要在一个填充了条件平均值和标准偏差的数据框中添加两列 # Import pandas library import pandas as pd # Initialize list of lists data = [ ['Tom', 'Blue', 'Small', 10, ], ['Tom', 'Blue', 'Big', 15, ], ['Tom', 'Red', 'Big', 3, ], ['Tom', 'Re

我需要在一个填充了条件平均值和标准偏差的数据框中添加两列

# Import pandas library 
import pandas as pd 

# Initialize list of lists 
data = [
    ['Tom',   'Blue', 'Small',  10, ], 
    ['Tom',   'Blue', 'Big',    15, ], 
    ['Tom',   'Red',  'Big',     3, ], 
    ['Tom',   'Red',  'Small',   8, ], 
    ['Tom',   'Red',  'Medium',  5, ], 
    ['Tom',   'Blue', 'Medium', 12, ], 
    ['Nick',  'Blue', 'Small',  15, ], 
    ['Nick',  'Red',  'Medium', 11, ], 
    ['Nick',  'Red',  'Small',  17, ], 
    ['Julie', 'Blue', 'Big',    14, ], 
    ['Julie', 'Red',  'Big',    11, ],
    ['Julie', 'Red',  'Medium',  3, ], 
    ['Julie', 'Red',  'Medium',  4, ],
]

# Create the pandas DataFrame 
df = pd.DataFrame(data, columns = ['Name', 'Colour', 'Size', 'Age']) 

# print dataframe. 
df
在本例中,我需要添加两列:
df['mean']
df['std']
仅以名称和颜色为条件

我查看了
.mean()
.std()
文档,但没有找到添加一组条件的方法。我相信我可能需要2个函数,对于每一行,将名称和颜色作为参数,计算整个系列的平均值或标准差,然后填充新列

我相信我需要一个函数来动态检查每行的名称和颜色,因为与此示例数据帧不同,我的应用程序针对的是具有数千个名称和数千种颜色的数据帧

我知道如何无条件地将
.mean
.std
应用于整个熊猫系列:

df['Age'].std()

我还发现,GROUPBY+转换做的事情稍有相似,但没有像函数那样动态检查每一行的能力

df['mean'] = df.groupby(['Name','Colour']).transform('mean')
谢谢你的帮助

这是我期望的输出。谢谢你的回答:
由于
transform
不支持
std
,我们可以通过
groupby().agg
merge

new_df = df.groupby(['Name', 'Colour']).Age.agg({'mean','std'})
df = df.merge(new_df, left_on=['Name', 'Colour'], right_index=True)
输出:

     Name Colour    Size  Age       std       mean
0     Tom   Blue   Small   10  2.516611  12.333333
1     Tom   Blue     Big   15  2.516611  12.333333
5     Tom   Blue  Medium   12  2.516611  12.333333
2     Tom    Red     Big    3  2.516611   5.333333
3     Tom    Red   Small    8  2.516611   5.333333
4     Tom    Red  Medium    5  2.516611   5.333333
6    Nick   Blue   Small   15       NaN  15.000000
7    Nick    Red  Medium   11  4.242641  14.000000
8    Nick    Red   Small   17  4.242641  14.000000
9   Julie   Blue     Big   14       NaN  14.000000
10  Julie    Red     Big   11  4.358899   6.000000
11  Julie    Red  Medium    3  4.358899   6.000000
12  Julie    Red  Medium    4  4.358899   6.000000

你能提供你想要的输出吗?df.groupby(['Name','color'])transform('mean')有什么问题吗??下面的解决方案对mean很好:df.groupby(['Name','color'])。transform('mean'),但我没有找到标准偏差的等效值。groupby(['Name','color']).transform('std')您可以添加预期的输出,这样我们就可以停止这种猜测游戏了。Thanks@Alphynn
转换
std
应该可以工作。你能评论一下为什么没有?我猜您得到的是
ValueError:传递的项目数错误2,placement意味着1
,因为您只需要转换年龄列。添加
mean
列后,它也将转换该列。我缺少什么<代码>df.groupby(['Name','color']).Age.transform('std')来自OP评论的工作。也许
df.groupby(['Name','color']).Age.transform('std')
?啊!的确它在没有年龄限制的情况下工作。对于平均值,但它需要。年龄。为了代码的一致性,我在两者中都添加了.Age,它可以工作:df['mean']=df.groupby(['Name','color']).Age.transform('mean')df['std']=df.groupby(['Name','color']).Age.transform('std')谢谢!
     Name Colour    Size  Age       std       mean
0     Tom   Blue   Small   10  2.516611  12.333333
1     Tom   Blue     Big   15  2.516611  12.333333
5     Tom   Blue  Medium   12  2.516611  12.333333
2     Tom    Red     Big    3  2.516611   5.333333
3     Tom    Red   Small    8  2.516611   5.333333
4     Tom    Red  Medium    5  2.516611   5.333333
6    Nick   Blue   Small   15       NaN  15.000000
7    Nick    Red  Medium   11  4.242641  14.000000
8    Nick    Red   Small   17  4.242641  14.000000
9   Julie   Blue     Big   14       NaN  14.000000
10  Julie    Red     Big   11  4.358899   6.000000
11  Julie    Red  Medium    3  4.358899   6.000000
12  Julie    Red  Medium    4  4.358899   6.000000