Панды: отбрасывать дубликаты на основе значения строки - PullRequest
3 голосов
/ 21 октября 2019

У меня есть фрейм данных, и я хочу удалить дубликаты, основанные на различных условиях ....

        A      B
  0     1     1.0
  1     1     1.0
  2     2     2.0
  3     2     2.0
  4     3     3.0
  5     4     4.0
  6     5     5.0
  7     -     5.1
  8     -     5.1
  9     -     5.3

Я хочу удалить все дубликаты из столбца A, кроме строк с «-». После этого я хочу удалить дубликаты из столбца A с «-» в качестве значения, основанного на значении их столбца B. Учитывая входной фрейм данных, это должно вернуть следующее: -

        A      B
  0     1     1.0
  2     2     2.0
  4     3     3.0
  5     4     4.0
  6     5     5.0
  7     -     5.1
  9     -     5.3

У меня есть следующий код, но он не очень эффективен для очень больших объемов данных, как я могу улучшить это ....

 def generate(df):
     str_col = df[df["A"] == "-"]

     df.drop(df[df["A"] == "-"].index, inplace=True)

     df = df.drop_duplicates(subset="A")

     str_col = b.drop_duplicates(subset="B")

     bigdata = df.append(str_col, ignore_index=True)

     return bigdata.sort_values("B")

Ответы [ 3 ]

5 голосов
/ 21 октября 2019

duplicated и eq:

df[~df.duplicated('A')            # keep those not duplicates in A
   | (df['A'].eq('-')             # or those '-' in A
      & ~df['B'].duplicated())]   # which are not duplicates in B

Вывод:

   A    B
0  1  1.0
2  2  2.0
4  3  3.0
5  4  4.0
6  5  5.0
7  -  5.1
9  -  5.3
2 голосов
/ 21 октября 2019

groupby + head

df.groupby(['A','B']).head(1)
Out[7]: 
   A    B
0  1  1.0
2  2  2.0
4  3  3.0
5  4  4.0
6  5  5.0
7  -  5.1
9  -  5.3
2 голосов
/ 21 октября 2019

df.drop_duplicates(subset=['A', 'B'])

При полном наборе данных:

   A    B  C
0  1  1.0  0
1  1  1.0  1
2  2  2.0  2
3  2  2.0  3
4  3  3.0  4
5  4  4.0  5
6  5  5.0  6
7  -  5.1  7
8  -  5.1  8
9  -  5.3  9

Результат:

   A    B  C
0  1  1.0  0
2  2  2.0  2
4  3  3.0  4
5  4  4.0  5
6  5  5.0  6
7  -  5.1  7
9  -  5.3  9
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...