为什么.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[]
为何显示此行为方面,我会更有趣。
答案 0 :(得分:1)
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