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