【问题标题】:How to define a python lambda getting the first element?如何定义一个获取第一个元素的python lambda?
【发布时间】:2019-09-25 07:08:30
【问题描述】:
import pandas as pd
df = pd.DataFrame({'A': [0, 0, 1, 1], 
                   'B': [1, 3, 8, 10], 
                   'C': ['alpha', 'bravo', 'charlie', 'delta']})

现在,我想使用自己的 lambda 对数据进行分组,但它们的行为与我的预期不同。以下示例中的 lambda 应返回组中列的第一个值:

df.groupby('A', as_index = False).agg({'B':'mean', 
                                       'C': lambda x: x[0]})

代码抛出KeyError: 0,我不清楚,因为['alpha', 'bravo'][0] 给出'alpha'

所以总体上想要的输出:

    A   B          C
0   0   2    'alpha'
1   1   9  'charlie'

【问题讨论】:

    标签: python pandas lambda group-by


    【解决方案1】:

    如果需要选择组中的第一个值,请使用Series.iatSeries.iloc 按位置选择:

    df1 = df.groupby('A', as_index = False).agg({'B':'mean', 'C': lambda x: x.iat[0]})
    

    另一种解决方案是使用GroupBy.first:

    df1 = df.groupby('A', as_index = False).agg({'B':'mean', 'C': 'first'})
    print (df1)
       A  B        C
    0  0  2    alpha
    1  1  9  charlie
    

    您能否解释一下为什么 lambda 不起作用?

    问题在于第二组,索引不是0,而是2,引发错误,因为x[0] 尝试使用0 按索引搜索,而第二组不存在:

    df1 = df.groupby('A', as_index = False).agg({'B':'mean', 'C': lambda x: print (x[0])})
    print (df1)
    alpha <- return first value of first group only, because alpha has index 0
    alpha
    alpha
    

    因此,如果为组的第一个值设置索引0,它将使用此示例数据:

    df = pd.DataFrame({'A': [0, 0, 1, 1], 
                       'B': [1, 3, 8, 10], 
                       'C': ['alpha', 'bravo', 'charlie', 'delta']}, index=[0,1,0,1])
    print (df)
       A   B        C
    0  0   1    alpha <- index is 0
    1  0   3    bravo
    0  1   8  charlie <- index is 0
    1  1  10    delta
    
    df1 = df.groupby('A', as_index = False).agg({'B':'mean', 'C': lambda x: x[0]})
    print (df1)
       A  B        C
    0  0  2    alpha
    1  1  9  charlie
    

    【讨论】:

    • 您能否解释一下为什么 lambda 不起作用?
    • @Barmar - 为您解释。
    【解决方案2】:

    解释说明为什么您的lambda 函数不起作用。

    当我们使用groupby 时,我们会返回一个 groupby 对象:

    g = df.groupby('A')
    
    print(g)
    <pandas.core.groupby.generic.DataFrameGroupBy object at 0x0000023AA1BB41D0>
    

    当我们访问 groupby 对象中的元素时,我们会返回 分组数据帧

    for idx, d in g:
        print(d, '\n')
    
       A  B      C
    0  0  1  alpha
    1  0  3  bravo 
    
       A   B        C
    2  1   8  charlie
    3  1  10    delta 
    

    这就是为什么我们需要将这些元素作为 DataFrame 来威胁。正如 jezrael 在他的回答中已经指出的那样,有几种方法可以访问 C 列中的第一个值:

    for idx, d in g:
        print(d['C'].iat[0])
        print(d['C'].iloc[0], '\n')
    
    alpha
    alpha 
    
    charlie
    charlie 
    

    【讨论】:

      猜你喜欢
      • 2022-06-14
      • 2016-07-14
      • 2012-06-22
      • 2014-09-08
      • 2014-08-02
      • 2021-12-08
      • 1970-01-01
      • 1970-01-01
      • 2022-08-17
      相关资源
      最近更新 更多