Удаление повторяющихся строк в кадре данных с некоторыми условиями для данных в определенном столбце - PullRequest
0 голосов
/ 12 июля 2019

У меня есть следующий фрейм данных, df

Index   time   block   cell
 0       9      25      c1
 1       9      25      c1
 2       33     35      c2
 3       47     4       c1
 4       47     17      c2
 5       100    21      c1
 6       120    21      c1
 7       120    36      c2

Дубликаты должны быть отброшены на основе столбца времени.Однако есть условие: - если два или более одинаковых времени имеют одинаковые ячейки, например, индекс 0 и индекс 1 имеют c1, то сохраняют любой из столбцов.- если два или более одинаковых времени имеют разные ячейки, например, индексы 3 и 4 и индексы 6 и 7, сохраните все строки, соответствующие повторяющимся временам

Полученный кадр данных будет выглядеть следующим образом: df_result =

Index   time   block   cell
 0       9      25      c1
 2       33     35      c2
 3       47     4       c1
 4       47     17      c2
 5       100    21      c1
 6       120    21      c1
 7       120    36      c2

Пробовал df.drop_duplicates('time')

Ответы [ 2 ]

1 голос
/ 12 июля 2019

Этого можно добиться, разбив исходный DataFrame на категории, а затем запустив drop_duplicates() в каждой категории.

import pandas as pd

df = pd.DataFrame({'time':[9,9,33,47,47,100,120,120],'block':[25,25,35,4,17,21,21,36],'cell':'c1;c1;c2;c1;c2;c1;c1;c2'.split(';')})

categories = df['cell'].astype('category').unique()
df2 = pd.DataFrame()
for category in categories:
    df2 = pd.concat([df2, df[df['cell'] == category].drop_duplicates(keep='first')])

df2 = df2.sort_index()

В результате df2 будет

    time  block cell
0     9     25   c1
2    33     35   c2
3    47      4   c1
4    47     17   c2
5   100     21   c1
6   120     21   c1
7   120     36   c2
0 голосов
/ 12 июля 2019

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

df = pd.DataFrame({'time':[9,9,33,47,47,100,120,120],'block':[25,25,35,4,17,21,21,36],'cell': ['c1','c1','c2','c1','c2','c1','c1','c2']})
grouped = df.groupby('time')
final_df = pd.DataFrame({'time':[] ,'block':[],'cell':[]})
for ind, gr in grouped:
    final_df = final_df.append(gr.drop_duplicates("cell"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...