Pandas без удаления дубликатов - PullRequest
2 голосов
/ 04 августа 2020

В следующем скрипте

import pandas as pd

def start():
    df_dict = {"A": [1,2,3,3,4], "B": [1,2,2,3,4]}
    df = pd.DataFrame(df_dict)

    df.drop_duplicates(inplace = True, keep = "last")

    print(df)

if __name__ == "__main__":
    start()

Дубликаты в df не удаляются. В чем может быть причина

Токовый выход:

   A  B
0  1  1
1  2  2
2  3  2
3  3  3
4  4  4

Ожидаемый выход:

   A  B
0  1  1
1  2  2
3  3  3
4  4  4

Ответы [ 3 ]

2 голосов
/ 04 августа 2020

Метод .drop_duplicates() просматривает повторяющиеся строки для всех столбцов фрейма данных, поэтому вам нужно использовать .drop_duplicates() при поднаборе для каждого из двух столбцов, а затем получить пересечение этих двух подмножеств фреймов данных (внутреннее слияние). Вместо того, чтобы распечатывать получившийся фрейм данных, вероятно, в ваших интересах, чтобы ваша функция возвращала фрейм данных.

import pandas as pd

def start():
    df_dict = {"A": [1,2,3,3,4], "B": [1,2,2,3,4]}
    df = pd.DataFrame(df_dict)

    # drop duplicates within each column
    df1 = df.drop_duplicates(subset='A', keep='last')
    df2 = df.drop_duplicates(subset='B', keep='last')

    return pd.merge(df1,df2,how='inner')

if __name__ == "__main__":
    result = start() 

Вывод:

>>> result
   A  B
0  1  1
1  3  3
2  4  4
0 голосов
/ 04 августа 2020

Благодаря Дереку О. Я достиг модифицированной версии его ответа без оператора слияния

import pandas as pd

def start():
    df_dict = {"A": [1,2,3,3,4], "B": [1,2,2,3,4]}
    df = pd.DataFrame(df_dict)

    df = df.drop_duplicates(subset = ["A"], keep = "last").drop_duplicates(subset = ["B"], keep = "last")

    print(df)

if __name__ == "__main__":
    start()

Что дает ожидаемый результат вопроса

0 голосов
/ 04 августа 2020

Проблема в том, что df.drop_duplicates() просматривает всю строку, а не только один столбец. Учитывая ваш текущий фрейм данных, уникальных строк нет.

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

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

import pandas as pd

def start():
    df_dict = {"A": [1,2,3,3,4], "B": [1,2,2,3,4]}
    df = pd.DataFrame(df_dict)

    df_copy = df
    unique_list = []
    for index, value in df_copy.iterrows():

      if value['A'] not in unique_list:
        unique_list.append(value['A'])
      else:
        df = df.drop(index) 
    
    return df

start()

Вывод:


    A   B
0   1   1
1   2   2
2   3   2
4   4   4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...