【发布时间】:2021-07-27 17:18:22
【问题描述】:
我有一个格式如下的数据框:
d = {'id1': ['a', 'a', 'b', 'b',], 'id2': ['a', 'b', 'b', 'c'], 'score': ['1', '2', '3', '4']}
df = pd.DataFrame(data=d)
print(df)
id1 id2 score
0 a a 1
1 a b 2
3 b b 3
4 b c 4
数据框有超过 10 亿行,它表示 id1 和 id2 列中对象之间的成对距离分数。我不需要所有对象对组合,对于 id1 中的每个对象(大约有 40k 个唯一 ID),我只想保留前 100 个最接近(最小)的距离分数
我正在运行的代码如下:
df = df.groupby(['id1'])['score'].nsmallest(100)
这段代码的问题是我每次尝试运行时都会遇到内存错误
MemoryError: Unable to allocate 8.53 GiB for an array with shape (1144468900,) and data type float64
我假设这是因为在后台 pandas 现在正在为 group by 的结果创建一个新的数据框,但现有的数据框仍然保存在内存中。
我只取每个 id 的前 100 个的原因是为了减小数据框的大小,但我似乎在执行该过程时实际上占用了更多空间。
有什么方法可以过滤掉这些数据而不占用更多内存?
所需的输出将是这样的(假设前 1 名而不是前 100 名)
id1 id2 score
0 a a 1
1 b b 3
关于原始 df 的一些附加信息:
df.count()
permid_1 1144468900
permid_2 1144468900
distance 1144468900
dtype: int64
df.dtypes
permid_1 int64
permid_2 int64
distance float64
df.shape
dtype: object
(1144468900, 3)
id1 & id2 unique value counts: 33,830
【问题讨论】:
-
如果您没有太多不同的
id1s,您可以为每个唯一值使用循环,按该值过滤df并对其进行排序,并将前100个附加到一个新的df。 -
我们很清楚,
score不仅仅是id1的最近邻居的排名顺序,对吗?这是一些正的实值距离度量吗? -
您能否打印
df.count()、df.dtypes和df.shape以获得您拥有的全部数据,并将其添加到问题中。 -
@KyleParsons 是的,这是正确的,它是余弦相似度
-
@ThePyGuy 刚刚添加