Выберите строки во фрейме данных Pandas на основе нескольких условий столбца - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть набор данных, как показано ниже

id     date  time  domain       activity
1  20thdec     2  amazon  add to basket
1  21stdec     2  amazon   product view
1  21stdec     3  amazon  add to basket
1  21stdec     4  amazon  add to basket
2  21stdec     4  amazon  add to basket
2  21stdec     6  amazon  add to basket 

Как избавиться от строк, содержащих одинаковое значение в столбце действия (т. Е. Для device_id = 2 единственное действие - add to basket. Я все еще хочу сохранить формат для id 1, который имеет несколько (дубликат) значения add to basket, но имеет и другую активность

Я пытался pd.drop_duplicates, однако это не решает проблему.

Редактировать: Ни одно из приведенных ниже решений не работает, мне нужен вывод, как показано ниже

id     date  time  domain       activity
1  20thdec     2  amazon  add to basket
1  21stdec     2  amazon   product view
1  21stdec     3  amazon  add to basket
1  21stdec     4  amazon  add to basket

Данные для id = 2 должны быть удалены, так как все действия, независимо от даты / времени, не содержат ничего, кроме добавления в корзину, поэтому следует удалять все отдельные строки действий и сохранять только те строки данных, в которых указано несколько действий, т.е. в id = 1 есть 2 уровня активности (просмотр товара и добавление в корзину)

Извинения, если это вызвало какое-либо неправильное толкование

Спасибо

Ответы [ 4 ]

0 голосов
/ 09 ноября 2018

Я думаю, вам нужно transform с nunique с фильтрацией по ne ne(1) что возвращают не уникальные группы:

print (df)
   id     date  time  domain       activity
0   1  20thdec     2  amazon  add to basket
1   1  21stdec     2  amazon   product view
2   1  21stdec     3  amazon  add to basket
3   1  21stdec     4  amazon  add to basket
4   2  21stdec     4  amazon  add to basket
5   2  21stdec     6  amazon  add to basket
6   3  21stdec     6  amazon  add to basket

df = df[df.groupby('id')['activity'].transform('nunique').ne(1)]
print (df)

   id     date  time  domain       activity
0   1  20thdec     2  amazon  add to basket
1   1  21stdec     2  amazon   product view
2   1  21stdec     3  amazon  add to basket
3   1  21stdec     4  amazon  add to basket

Еще одно решение для удаления только дублированных групп по столбцам id и activity, поэтому уникальные строки не удаляются:

idx = df.loc[~df.duplicated(['id','activity'], keep=False), 'id'].unique()
df = df[df['id'].isin(idx)]

Или:

df = df[~df.duplicated(['id','activity'], keep=False).groupby(df['id']).transform('all')]

print (df)
   id     date  time  domain       activity
0   1  20thdec     2  amazon  add to basket
1   1  21stdec     2  amazon   product view
2   1  21stdec     3  amazon  add to basket
3   1  21stdec     4  amazon  add to basket
6   3  21stdec     6  amazon  add to basket
0 голосов
/ 09 ноября 2018

Насколько я понял, вы хотите сбросить только дубликаты, где id == 2. Вы все еще можете использовать drop_duplicates, но вы должны указать subset='activity' только в тех строках кадра данных, которые имеют id==2. Тогда вы concat это вместе с теми строками, имеющими id==1

df = pd.concat([df[df['id'] == 1], df[df['id'] == 2].drop_duplicates(subset='activity')])

1010 * дает *

   id     date  time  domain       activity
0   1  20thdec     2  amazon  add to basket
1   1  21stdec     2  amazon   product view
2   1  21stdec     3  amazon  add to basket
3   1  21stdec     4  amazon  add to basket
4   2  21stdec     4  amazon  add to basket
0 голосов
/ 09 ноября 2018

IIUC, используйте groupby + transform с nunique и рассчитайте cumsum для значений, не равных (ne) 1, а затем используйте drop_duplicates с параметром subset:

df.dropna(how='all',inplace=True)
cols = df.columns
df['Unique'] = df.groupby('id')['activity'].transform('nunique')
mask = df['Unique'].ne(1)
df.loc[mask,'Unique'] = df.loc[mask,'Unique'].cumsum()

df1 = df.drop_duplicates(subset = ['activity','Unique'])[cols]

print(df1)

   id     date  time  domain       activity
0   1  20thdec     2  amazon  add to basket
1   1  21stdec     2  amazon   product view
2   1  21stdec     3  amazon  add to basket
3   1  21stdec     4  amazon  add to basket
5   2  21stdec     4  amazon  add to basket

Объяснение:

print(df.groupby('id')['activity'].transform('nunique'))
0    2
1    2
2    2
3    2
5    1
6    1
Name: activity, dtype: int64

print(df['Unique'].ne(1))
0     True
1     True
2     True
3     True
5    False
6    False
Name: Unique, dtype: bool

# After the line df.loc[mask,'Unique'] = df.loc[mask,'Unique'].cumsum()
print(df['Unique'])
0    2
1    4
2    6
3    8
5    1
6    1
Name: Unique, dtype: int64
0 голосов
/ 09 ноября 2018

Вы можете указать параметр subset в drop_duplicates:

dataset.drop_duplicates(subset=['id', 'activity'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...