Pandas无法删除重复项。

3
在下面的脚本中
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

drop_duplicates 函数可以删除重复的行,但是您没有任何重复的行。您想要做什么? - Aguy
你期望的输出是什么?因为默认情况下 drop_duplicates 只比较行,如果要处理列,请使用 subset=['A'] - santiagoNublado
我期望在每一列中,任何重复的内容都被删除。因此,索引为1和2的行应该被删除。 - Hussein Fawzy
3个回答

3
.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
问题是 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

0
感谢 Derek O.,我找到了他回答的修改版本,而且没有使用合并语句。
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()

这将产生问题的预期结果


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接