python - Numpy:从 Pandas 数据帧创建可变长度序列

标签 python pandas numpy numpy-ndarray

假设我有以下数据框:

df_raw = pd.DataFrame({"person_id": [101, 101, 102, 102, 102, 103], "date": [0, 5, 0, 7, 11, 0], "val1": [99, 11, 22, 33, 44, 22], "val2": [77, 88, 22, 66, 55, 33]})

我想要实现的是创建一个 3 维 numpy 数组,结果应如下所示:

np_pros = np.array([[[0, 99, 77], [5, 11, 88]], [[0, 22, 22], [7, 33, 66], [11, 44, 55]], [[0, 22, 33]]])

换句话说,3D 数组应具有以下形状 [unique_ids, None, feature_size]。在我的例子中,unique_ids 的数量是 3,feature size 是 3(除 person_id 之外的所有列), y 列的长度可变,它表示 person_id 的测量次数。

我很清楚我可以创建一个 np.zeros((unique_ids, max_num_features, feature_size)) 数组,填充它然后删除我不需要但我想要的元素快点。原因是我的实际数据框很大(大约 [50000, 455]),这将导致一个大约 [12500, 200, 455] 的 numpy 数组。

期待您的回答!

最佳答案

这是一种方法:

ix = np.flatnonzero(df1.person_id != df1.person_id.shift(1))
np.split(df1.drop('person_id', axis=1).values, ix[1:])

[array([[ 0, 99, 77],
        [ 5, 11, 88]], dtype=int64), 
 array([[ 0, 22, 22],
        [ 7, 33, 66],
        [11, 44, 55]], dtype=int64), 
 array([[ 0, 22, 33]], dtype=int64)]

详情

使用np.flatnonzero在将 df1 与自身的移位版本 ( pd.shift ) 进行比较以获得 person_id 发生变化的索引之后:

ix = np.flatnonzero(df1.person_id != df1.person_id.shift(1))
#array([0, 2, 5])

使用np.split为了根据获得的索引拆分数据框的感兴趣列:

np.split(df1.drop('person_id', axis=1).values, ix[1:])

[array([[ 0, 99, 77],
        [ 5, 11, 88]], dtype=int64), 
 array([[ 0, 22, 22],
        [ 7, 33, 66],
        [11, 44, 55]], dtype=int64), 
 array([[ 0, 22, 33]], dtype=int64)]

关于python - Numpy:从 Pandas 数据帧创建可变长度序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54130018/

相关文章:

java - 从 Java 调用 Python 脚本。我应该使用 Docker 吗?

Pandas 滚动窗口有效添加新行

numpy - scikit-image:平均过滤器更改 dtype

带有点和误差条的 Python 直方图

python - Python 列表(元组)中每个元素有多少字节?

python - 从命令行运行时出现 ModuleNotFoundError

python - 类不能使用 mypy 子类化 'QObject'(类型为 'Any')

python - 在 pandas 数据框中查找具有 NaN 的行的整数索引

python - pandas中map函数的使用

python - 导出函数,以输入变量命名导出文件