Создание переменной выбора, которая указывает, какой выбор был сделан, путем присвоения имени столбцу - Pandas - PullRequest
1 голос
/ 23 сентября 2019

Я хочу создать переменную "choice", которая указывает, какой выбор был сделан среди некоторых альтернатив.Альтернативы в этом примере: 123, 456, 789. Если выбора нет, присвойте значение 0, если есть множественный выбор, присвойте значение 1, в противном случае присвойте имя выбора (взяв имя столбца).

Иллюстрация данных:

ID  Date        X   123 456 789
A   07/16/2019  ..  1   0   0
A   07/19/2019  ..  0   0   0
A   07/20/2019  ..  0   1   0
A   07/22/2019  ..  1   0   0
A   07/23/2019  ..  0   1   1
B   07/27/2019  ..  0   0   1
B   07/28/2019  ..  0   0   0
B   07/30/2019  ..  0   0   0

Ожидаемый результат:

ID  Date        X   123 456 789 choice
A   07/16/2019  ..  1   0   0   123
A   07/19/2019  ..  0   0   0   0
A   07/20/2019  ..  0   1   0   456
A   07/22/2019  ..  1   0   0   123
A   07/23/2019  ..  0   1   1   1
B   07/27/2019  ..  0   0   1   789
B   07/28/2019  ..  0   0   0   0
B   07/30/2019  ..  0   0   0   0

Ответы [ 2 ]

3 голосов
/ 23 сентября 2019

Использование numpy.select с DataFrame.idxmax:

#seelct last 3 columns
df1 = df.iloc[:, -3:]
#sum 1 values
s = df1.sum(axis=1)
#set values by conditions
df['choice'] = np.select([s == 1, s == 0], [df1.idxmax(axis=1), 0], default=1)
print (df)
  ID        Date   X  123  456  789 choice
0  A  07/16/2019  ..    1    0    0    123
1  A  07/19/2019  ..    0    0    0      0
2  A  07/20/2019  ..    0    1    0    456
3  A  07/22/2019  ..    1    0    0    123
4  A  07/23/2019  ..    0    1    1      1
5  B  07/27/2019  ..    0    0    1    789
6  B  07/28/2019  ..    0    0    0      0
7  B  07/30/2019  ..    0    0    0      0
1 голос
/ 23 сентября 2019

Вот способы сделать это путем выбора, используя пользовательскую функцию, которая выполняет эту работу, и панды применяются :

#list with the names of valid alternative columns
alternatives = ['123', '456', '789']

#custom function to do the selection
def pick_choice(row):
    ones = row[alternatives].loc[row[alternatives] == 1]
    if len(ones) == 0:
        return 0
    elif len(ones) > 1:
        return 1
    elif len(ones) == 1:
        return ones.index[0]

df['choice'] = df.apply(pick_choice, axis=1)

В результате df это:

  ID        Date   X  123  456  789 choice
0  A  07/16/2019  ..    1    0    0    123
1  A  07/19/2019  ..    0    0    0      0
2  A  07/20/2019  ..    0    1    0    456
3  A  07/22/2019  ..    1    0    0    123
4  A  07/23/2019  ..    0    1    1      1
5  B  07/27/2019  ..    0    0    1    789
6  B  07/28/2019  ..    0    0    0      0
7  B  07/30/2019  ..    0    0    0      0

Обратите внимание, что dtype столбца 'choice' равен object, а не int, поскольку имена столбцов являются строками (даже если у вас есть целые числа).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...