这个问题的重点是单词names和in place,因为我想删除具有相同名称的列(无论值如何),但我不想删除具有相同值但名称不同的列,我想高效地完成它。
换句话说,我正在寻找 df = df.loc[:, ~df.columns.duplicated()]
的
in place版本,以避免数据帧的临时副本。
import pandas as pd
df = pd.DataFrame([[0, 1, 2, 0, 0],[1, 2, 3, 1, 1], [2, 3, 4, 2, 2]], columns=iter('ABCAD'))
# expected result
print(df.loc[:, ~df.columns.duplicated()])
其基本原理是清理大型数据帧。
这不应该是 copy-on-Write 机制的问题,该机制只会在分配数据时进行复制(将是 pandas 3 中的默认设置)。
rename
将列放置到位,然后再将“重复项”放置到位:
old_cols = df.columns
new_cols = pd.io.common.dedup_names(df.columns, False)
df = df.set_axis(new_cols, axis=1, copy=False)
df.drop(columns=old_cols.symmetric_difference(new_cols), inplace=True)