Создать столбец на основе значений нескольких строк, привязанных к ключу - PullRequest
0 голосов
/ 28 октября 2018

У меня есть DataFrame с клиентами и категориями, в которых они совершают покупки, и я хочу знать, является ли клиент покупателем в разных категориях (есть только три категории).Какой лучший способ превратить это:

Customer Category
foo      A
foo      B
boo      A
zoo      C

к этому:

Customer  A B C CrossCategory
foo       Y Y N  True
boo       Y N N  False
zoo       N N Y  False

1 Ответ

0 голосов
/ 28 октября 2018

Если вас интересует только столбец CrossCategory, вы можете использовать:

df.groupby('Customer')['Category'].nunique() > 1

, что дает

Customer
boo    False
foo     True
zoo    False
Name: Category, dtype: bool

Для части pivot:

Вы можете добавить еще один столбец:

df['visited'] = 'Y'

и затем использовать pivot

p = df.pivot(index='Customer', columns='Category', values='visited').fillna('N')

Category  A  B  C
Customer         
boo       Y  N  N
foo       Y  Y  N
zoo       N  N  Y

Затем мы используем второй подход, чтобы получить столбец CrossCategory

# alternative approach to the nunique part from above
df['CrossCategory'] = df.groupby('Customer')['Category'].transform('size') > 1

  Customer Category visited  CrossCategory
0      foo        A       Y           True
1      foo        B       Y           True
2      boo        A       Y          False
3      zoo        C       Y          False

и, наконец, объединить два кадра данных

pd.concat([p, df[['Customer', 'CrossCategory']].drop_duplicates().set_index('Customer')], sort=False, axis=1)

Это дает:

     A  B  C  CrossCategory
boo  Y  N  N          False
foo  Y  Y  N           True
zoo  N  N  Y          False

Я почти уверен, что есть более элегантные решения, но это дает желаемый результат.

Если у вас большие наборы данных, вы можете запустить groupby с sort=False.

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