Как определить Python лямбда, получая первый элемент? - PullRequest
1 голос
/ 07 мая 2019
import pandas as pd
df = pd.DataFrame({'A': [0, 0, 1, 1], 
                   'B': [1, 3, 8, 10], 
                   'C': ['alpha', 'bravo', 'charlie', 'delta']})

Теперь я хотел бы сгруппировать данные, используя собственные лямбды, но они ведут себя не так, как я ожидаю.Лямбда в следующем примере должна возвращать первое значение столбца в группе:

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'

Ответы [ 2 ]

1 голос
/ 07 мая 2019

Маленькое объяснение о том, почему ваша функция 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 

Так вот почему нам нужно угрожать этим элементам как DataFrames.Как Джезраэль уже указал в своем ответе, есть несколько способов получить доступ к первому значению в вашем столбце C:

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

alpha
alpha 

charlie
charlie 
1 голос
/ 07 мая 2019

Если необходимо выбрать первое значение в группе, необходимо использовать Series.iat или Series.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

Можете ли вы объяснить, почему лямбда не работает?

Проблема для второй группы, есть индекс не 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...