熊猫不删除重复项

时间:2020-08-03 22:10:58

标签: python pandas

在以下脚本中

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 个答案:

答案 0 :(得分:2)

.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

答案 1 :(得分:0)

问题是df.drop_duplicates()着眼于整个行而不仅仅是一列。根据您当前的数据框架,没有唯一的行。

因此,假设您要基于单列中的重复项删除行。现在的主要问题是如何确定要删除的行。

下面的示例将仅在'A'列的基础上保留行中第一次出现的值,并且不会重置数据帧索引。

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

答案 2 :(得分:0)

感谢DerekO。我得到了他的答案的修改版本,而没有合并语句

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()

哪个会产生问题的预期结果