为什么.loc[]
在我的DataFrame中产生重复的行?我正在尝试从m3中选择几列,即一个47列的DataFrame,以创建一个称为output的新DataFrame。
问题:用.loc[]
访问m3的列后,输出的重复项比开始时m3的重复项多。这些副本从何而来?我还没有找到关于.loc[]
复制行的任何在线信息。顺便说一下,输出DataFrame在读取output = m3.loc[...]
的行上声明。
代码:
print("ARE THERE DUPLICATES in m3? ")
print(m3.duplicated().loc[lambda x: x==True])
output = m3.loc[:,["PLC_name", "line", "track", "notes", "final_source",
"s_name", "s_line", "s_track", "loc", "alt_loc", "suffix", "alt_match_name"]]
print("ARE THERE DUPLICATES in output? ")
print(output.duplicated().loc[lambda x: x==True].size, "duplicates")
终端输出:
ARE THERE DUPLICATES in m3?
5241 True
5242 True
5243 True
5355 True
5356 True
5357 True
dtype: bool
ARE THERE DUPLICATES in output?
1838 duplicates
当然,我可以通过调用
.drop_duplicates(keep="first")
轻松解决问题,但是在学习.loc[]
为何显示此行为方面我更有趣。 最佳答案
output
为m3
中的选定列过滤。当您在duplicated
上调用m3
时,将考虑原始数据帧中的所有列。在duplicated
上调用output
时,仅考虑这些列的子集。
因此,即使output
中没有重复项,您也可以在m3
中具有重复项。
这是您所看到的内容的最小且可复制的示例:
df = pd.DataFrame([[3, 8, 9], [4, 8, 9]])
print(df.duplicated().sum(), 'duplicates')
# 0 duplicates
df_filtered = df.loc[:, [1, 2]]
print(df_filtered.duplicated().sum(), 'duplicates')
# 1 duplicates