我正在处理一个用例,在这个用例中,我对每个id的许多特性进行了很多观察,并且我需要计算每个id每列的值频率(~5个离散值)
我有一个解决方案,它适用于相当小的数据集(例如<;100万行),但在我的整个数据集上失败(将来可能会变得更大),因为它填满了我的RAM。我无法找到一个干净的groupby解决方案,因为我需要同时对多个列执行此操作
样本数据:
import pandas as pd
import numpy as np
n = 100 # Number of features
m = 100 # Number of classes
k = 10000 # number of occurrences per class
possible_values = [1, 2, 3, 4, 5]
df = []
for i in range(m):
for j in range(k):
df.append( np.append(i, np.random.choice(possible_values, n)) )
features = [f"feature{i}" for i in range(n)]
df = pd.DataFrame(df, columns=(["id"] + features))
没有groupby案例,这很容易:
df[features].apply(pd.value_counts).T / df.shape[0]
我的方法
melted = df.melt(id_vars="id", var_name='feature', value_name='value')
feature_freq_id = pd.crosstab(index=[melted.id, melted.feature], columns=melted.value).reset_index()
feature_freq_id[possible_values] = feature_freq_id[possible_values].div(feature_freq_id[possible_values].sum(axis=1), axis=0)
问题是melted
有n*m*k
行。我的数据集具有>;250项功能,>;200个id和每个id约5k个观察值,这意味着melted
将有>;2.5亿行。这导致我的内存最终被填满,python也随之消亡
预期结果:
feature_freq_id.head(3)
只是一个想法:将
groupby
置于id
之上,并结合您的“简单”方法:这应该可以避免内存
melt
-down相关问题 更多 >
编程相关推荐