Удалить дублирующиеся данные в строках из фрейма данных python, не затрагивая форму DataFrame - PullRequest
0 голосов
/ 17 марта 2020

имеют фрейм данных:

<!-- begin snippet: js hide: false console: true babel: false -->
> ==> index   A  B
>       0     1  10
>       1     1  20
>       2     1  30 
>       3     2  10

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

Результирующее O / p будет

> ==> Index  A  B
>       0       10
>       1    1  20
>       2       30
>       3    2  10

Как выполнить эту задачу.

1 Ответ

0 голосов
/ 17 марта 2020

Следующим образом вы можете выбрать дублирующиеся строки и интересующий столбец ('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

...