You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 06:53:15