在以下脚本中
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
答案 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()
哪个会产生问题的预期结果