为什么.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[]为何显示此行为方面我更有趣。

最佳答案

outputm3中的选定列过滤。当您在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

10-08 07:53