Следующим образом вы можете выбрать дублирующиеся строки и интересующий столбец ('A') и установить значение NAN.
# create df
df = pd.DataFrame([
[1, 10],
[1, 20],
[1, 30],
[2, 10]],
columns=['A', 'B'])
# replace duplicated elements with NAN, preserving the row
df.loc[df.duplicated(subset='A', keep='first'), 'A'] = np.nan
Исходная таблица:
A B
0 1 10
1 1 20
2 1 30
3 2 10
Измененная таблица:
A B
0 1.0 10
1 NaN 20
2 NaN 30
3 2.0 10
Столбец 'A' становится типом данных с плавающей запятой для поддержки NaN.
Используя duplicated
, вы можете указать первое (keep='first'
) или последнее (keep='last'
) вхождение элемента как оригинала - как это было - где другие те же элементы считаются дубликатами.
Относительно комментария @Quang Hoang нет логики c в duplicated
для выбора произвольного среднего элемента, как в вашем примере.
************* ************** после ответа ***************************
подписки Ваш ответ, я думаю, я понимаю, что вы хотите. Следующее - это не векторизованный подход, который должен подойти, если ваш фрейм данных не велик. Он сохраняет повторяющиеся значения B в список (см. Ниже)
# create sample dataframe
df = pd.DataFrame([
[1, 10],
[1, 20],
[1, 30],
[2, 10],
[3, 15],
[3, 20]],
columns=['A', 'B'])
# create a dictionary where unique column A values are keys, and values are all the column B values for a given key (whether the A value is a duplicate or not)
dictionary = dict()
for value in df.A.unique():
if len(df.loc[(df.A == value) & df.A.duplicated(keep=False)]) > 0:
all_values = df.loc[(df.A == value) & df.A.duplicated(keep=False), 'B'].tolist()
dictionary[value] = all_values
elif len(df.loc[(df.A == value) & df.A.duplicated(keep=False)]) == 0:
dictionary[value] = df.loc[(df.A == value), 'B'].tolist()
# make a new dataframe
df2 = pd.DataFrame(columns=['A', 'B'])
df2.A = list(dictionary.keys())
df2.B = list(dictionary.values())
В результате получается:
A B
0 1 [10, 20, 30]
1 2 [10]
2 3 [15, 20]
Если вы хотите sh удалить исходный кадр данных для освобождения памяти: del df