[英]Implement different functions for different groupby objects pandas
经过一番研究,我发现了以下内容( 将不同的功能应用于 object 组中的不同项目: Python pandas )。 这可能与我想要的完全相同,但我无法理解所提出的答案。 让我试着用一个简单的例子来解释我想要什么:
import pandas as pd
import numpy as np
df = pd.DataFrame({'B': ['one', 'one', 'two', 'three',
'two', 'two', 'one', 'three'],
'C': np.random.randn(8),
'D': np.random.randn(8)})
grouped = df.groupby(['B'])
假设我们有一个从上面构建的简单数据集,如下所示:
B C D
0 one -1.758565 -1.544788
1 one -0.309472 2.289912
2 two -1.885911 0.384215
3 three 0.444186 0.551217
4 two -0.502636 2.125921
5 two -2.247551 -0.188705
6 one -0.575756 1.473056
7 three 0.640316 -0.410318
在将它们分组到“B”列后,创建了 3 个组
现在,我如何在这些组上应用不同的功能,但仍将它们作为同一数据框的一部分。 例如,如果我想检查第 1 组中的元素是否 < 0.5,第 2 组中是否可被 2 整除,第 3 组中是否为 -ve。这些函数仅用于说明目的,我要强调的一点是它们应该不同应该应用于每个组的自定义函数,但结果应该是我们可以在一个数据框中查看的结果。 任何建议表示赞赏。
您可以使用np.where
定义您想要的任何逻辑:
df['Flag'] = np.where((df['B'] == 'one') & (df['C'] < 0.5), True, False)
df['Flag'] = np.where((df['B'] == 'two') & (df['C'] >= 0.5), True, df['Flag'])
df['Flag'] = np.where((df['B'] == 'three') & (df['C'] < 0.5), True, df['Flag'])
Out[85]:
B C D Flag
0 one -1.758565 -1.544788 True
1 one -0.309472 2.289912 True
2 two -1.885911 0.384215 False
3 three 0.444186 0.551217 True
4 two -0.502636 2.125921 False
5 two -2.247551 -0.188705 False
6 one -0.575756 1.473056 True
7 three 0.640316 -0.410318 False
从那里开始,假设您想要对True
的总数进行分组:
df = df.groupby('B')['Flag'].sum().reset_index()
B Flag
0 one 3.0
1 three 1.0
2 two 0.0
要实现为可调节的自定义 function(根据评论),您可以执行以下操作:
def flag(one, two, three):
df['Flag'] = np.where((df['B'] == 'one') & (one), True, False)
df['Flag'] = np.where((df['B'] == 'two') & (two), True, df['Flag'])
df['Flag'] = np.where((df['B'] == 'three') & (three), True, df['Flag'])
flag(one=df['C'] < 0.5, two=df['C'] >= 0.5, three=df['C'] < 0.5)
df
B C D Flag
0 one -1.758565 -1.544788 True
1 one -0.309472 2.289912 True
2 two -1.885911 0.384215 False
3 three 0.444186 0.551217 True
4 two -0.502636 2.125921 False
5 two -2.247551 -0.188705 False
6 one -0.575756 1.473056 True
7 three 0.640316 -0.410318 False
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.