Сгруппировать данные и удалить дубликаты

У меня есть данные в виде таблицы ниже

Name     Mas       Sce
   M      ( (87)    83
            (91)    
          (97) )    
   T        (77)    76
   R        (60)    32
   G        (95)    20
   M     ( (50)     89
            (50)    
          (99) )    

Некоторые из моих данных проходят через несколько строк, например, случай M. Данные заключаются в скобки

Я пробовал удалять дубликаты. Это работает, когда это одна строка. Но теперь у меня есть несколько строк в группе

import pandas as pd

d = {'Name': ['M', None, None, 'T', 'R', 'G', 'M', '', ''],
     'Mas': ['( (87)', '(91)', '(97) )', '(77)', '(60)', '(95)', '( (50)', '(50)', '(99) )'],
     'Sce': ['83', '', '', '76', '32', '20', '89', '', '']}
df = pd.DataFrame(d)
df['Name'] = df['Name'].ffill()
print(df)
df.drop_duplicates(subset='Name', keep='first', inplace=True)
print(df)

Я хочу удалить повторение данных. В этом случае 2-й М.

Name     Mas       Sce
   M      ( (87)    83
            (91)    
          (97) )    
   T        (77)    76
   R        (60)    32
   G        (95)    20

Я не уверен, что понимаю детали. Почему входные данные имеют None в одних местах и ​​пустые строки в других? Нулевые строки не заполняются. Во-вторых, почему вы не убираете скобки? Данные Mas в конечном итоге должны быть целыми, не так ли? В-третьих, ты тоже не хочешь наполнить Sce?

wjandrea 28.04.2024 19:36

И разве в результате не должно быть Name заполнено?

wjandrea 28.04.2024 19:50

«проходит через несколько столбцов» - вы имели в виду строки? Вы хотите, чтобы так и оставалось? Ваш подход интуитивно верен, но для этого потребуется свернуть пустые строки имен в строки выше.

Georgina Skibinski 28.04.2024 20:05

@wjandrea, это из-за каких-то отзывов. Круглые скобки, которые, как я думал, будут полезны для некоторой фильтрации шаблонов, но, по-видимому, не нужны. Мас-данные находятся в строке. Ситуация останется прежней. Имя не заполнено

user24599509 28.04.2024 20:27

@GeorrinaSkibinski исправлено. Это та часть, в которой у меня проблема

user24599509 28.04.2024 20:29
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
5
80
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Пытаться:

# make the `Name` column consistent -> change  "", None to NaNs
df["Name"] = np.where(df["Name"].isin(["", None]), np.nan, df["Name"])

# create a mask what to keep and what to discard
mask = ~(
    pd.Series(
        np.where(df["Name"].notna(), df["Name"].duplicated(keep = "first"), np.nan),
        index=df.index,
    )
    .ffill()
    .astype(bool)
)

# print final df
print(df[mask])

Распечатки:

  Name     Mas Sce
0    M  ( (87)  83
1  NaN    (91)    
2  NaN  (97) )    
3    T    (77)  76
4    R    (60)  32
5    G    (95)  20

Следует отметить, что вы пропускаете заполнение ОП.

wjandrea 28.04.2024 19:54

@wjandrea Я думаю, что это попытка, которую предпринял ОП, но она не сработала (я предполагаю, что первый фрейм данных, показанный ОП, является входными данными).

Andrej Kesely 28.04.2024 19:58

Ах да, достаточно справедливо. Я просто предположил, потому что всегда print(df) сразу после его создания. Я отредактировал код таким образом, но отредактирую его обратно.

wjandrea 28.04.2024 20:03

Вы можете избежать np.where с помощью эквивалентов Pandas: df["Name"].mask(df["Name"].isin(["", None])) и df["Name"].duplicated(keep = "first").where(df["Name"].notna()‌​) (что также позволяет избегать .astype(bool)).

wjandrea 28.04.2024 20:04
Ответ принят как подходящий

Однострочный текст в стиле панд с дубликатом , маской и ffill:

out = df[~df['Name'].duplicated()
          .mask(df['Name'].replace('', None).isna())
          .ffill().infer_objects(copy=False)]

Выход:

   Name     Mas Sce
0     M  ( (87)  83
1  None    (91)    
2  None  (97) )    
3     T    (77)  76
4     R    (60)  32
5     G    (95)  20

Другие вопросы по теме