Pandas dataframe转字符串去重时比较截断内容而非实际值的解决方法
解决DataFrame中转numpy数组为字符串时的截断问题
问题原因
当你用dataframe.astype(str)转换包含大尺寸numpy数组的列时,numpy会自动截断数组的字符串表示(用...代替中间元素),导致原本不同的数组被转换成相同的字符串,最终drop_duplicates无法识别它们的差异。而小尺寸数组不会触发截断,所以能正常去重。pd.set_option('display.max_colwidth', None)只控制DataFrame的显示列宽,不影响astype(str)生成的字符串本身,因此无效。
解决方案
方案1:将数组转为完整字符串
使用np.array2string并设置threshold=np.inf,强制生成数组的完整字符串表示,避免截断:
import pandas as pd import numpy as np def full_array_str(arr): return np.array2string(arr, threshold=np.inf) # 测试代码 A = np.zeros((100,100)) B = np.zeros((100,100)) A[50][50] = 1 B[50][51] = 1 data = [[A, 0], [B, 0]] df = pd.DataFrame(data) # 对数组列应用完整字符串转换 df_str = df.applymap(lambda x: full_array_str(x) if isinstance(x, np.ndarray) else str(x)) df_unique = df_str.drop_duplicates(keep=False) print(df_unique)
方案2:用哈希值替代字符串(更高效)
对于大数组,完整字符串会占用大量内存,推荐将数组转为唯一哈希值,通过比较哈希值实现去重:
import pandas as pd import numpy as np import hashlib def array_hash(arr): return hashlib.sha256(arr.tobytes()).hexdigest() # 测试代码 A = np.zeros((100,100)) B = np.zeros((100,100)) A[50][50] = 1 B[50][51] = 1 data = [[A, 0], [B, 0]] df = pd.DataFrame(data) # 生成哈希列 df_hash = df.applymap(lambda x: array_hash(x) if isinstance(x, np.ndarray) else str(x)) # 筛选非重复行 mask = ~df_hash.duplicated(keep=False) df_unique = df[mask] print(df_unique)
这两种方法都能避免截断问题,让drop_duplicates正确识别不同的数组,第一种情况也能得到和小数组测试一致的结果。
内容的提问来源于stack exchange,提问作者palongsag
相关产品推荐
相关产品推荐

