ошибка в существующей идентификации элемента при использовании «если в» - PullRequest
0 голосов
/ 28 июня 2018

Вот мой код:

df1 = pd.DataFrame({'a': [1,2,3,1,2,3,3],'b':[1,2,3,1,2,3,3],'type':[1,0,1,0,1,0,1]})
def add_buy_label(group):
    behavior_type = group.type.astype(int)
    if 1 in group['type']:
        group['buy_label'] = 1
    else:
        group['buy_label'] = 0

    return group[['a', 'b', 'type','buy_label']]

Вышеприведенные функции должны сделать buy_label равным 1 для всех элементов a-b, пока существует один (тип = 1) в группе, однако результат после

df1.groupby(['a','b'],as_index = False).apply(add_buy_label)

есть

    a  b  type  buy_label
0  1  1     1          0
1  2  2     0          1
2  3  3     1          0
3  1  1     0          0
4  2  2     1          1
5  3  3     0          0
6  3  3     1          0

Довольно очевидно, что строка с 3 неверна, потому что в группе (a = 3, b = 3) существует тип = 1, но соответствующий buy_label равен 0.

Как я могу это исправить?

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Как объяснено, in с серией проверяет членство в индексе серии, а не в значениях серии. Представьте себе серию, подобную Python dict, и вы увидите, насколько последовательна обработка: for k in my_dict проверяет членство в словарных ключах.

Альтернативный способ сформулировать вашу логику - использовать groupby + transform с unique:

df1['buy_label'] = df1.groupby(['a', 'b'])['type']\
                      .transform('unique')\
                      .apply(lambda x: 1 in x)\
                      .astype(int)
0 голосов
/ 28 июня 2018

Проблема in значения тестовых индексов, а не значений столбцов.

#sorting for better seen groups 
df1 = df1.sort_values(['a','b'])
df2 = df1.groupby(['a','b'],as_index = False).apply(add_buy_label)
print (df2)
   a  b  type  buy_label
0  1  1     1          0
3  1  1     0          0
1  2  2     0          1 <- return 1 only because index == 1 per group (2,2)
4  2  2     1          1
2  3  3     1          0
5  3  3     0          0
6  3  3     1          0

Так что нужно comapre 1 с any для проверки хотя бы одного True:

if group['type'].eq(1).any():
#what is same as
if (group['type'] == 1).any():
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...