У меня есть данные в виде таблицы ниже
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
И разве в результате не должно быть Name заполнено?
«проходит через несколько столбцов» - вы имели в виду строки? Вы хотите, чтобы так и оставалось? Ваш подход интуитивно верен, но для этого потребуется свернуть пустые строки имен в строки выше.
@wjandrea, это из-за каких-то отзывов. Круглые скобки, которые, как я думал, будут полезны для некоторой фильтрации шаблонов, но, по-видимому, не нужны. Мас-данные находятся в строке. Ситуация останется прежней. Имя не заполнено
@GeorrinaSkibinski исправлено. Это та часть, в которой у меня проблема






Пытаться:
# 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 Я думаю, что это попытка, которую предпринял ОП, но она не сработала (я предполагаю, что первый фрейм данных, показанный ОП, является входными данными).
Ах да, достаточно справедливо. Я просто предположил, потому что всегда print(df) сразу после его создания. Я отредактировал код таким образом, но отредактирую его обратно.
Вы можете избежать np.where с помощью эквивалентов Pandas: df["Name"].mask(df["Name"].isin(["", None])) и df["Name"].duplicated(keep = "first").where(df["Name"].notna()) (что также позволяет избегать .astype(bool)).
Однострочный текст в стиле панд с дубликатом , маской и 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
Я не уверен, что понимаю детали. Почему входные данные имеют
Noneв одних местах и пустые строки в других? Нулевые строки не заполняются. Во-вторых, почему вы не убираете скобки? ДанныеMasв конечном итоге должны быть целыми, не так ли? В-третьих, ты тоже не хочешь наполнитьSce?