繁体   English   中英

针对不同的groupby对象实现不同的功能pandas

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM