【问题标题】:create a 3D matrix from 4 columns of a Dataframe从 Dataframe 的 4 列创建 3D 矩阵
【发布时间】:2020-11-04 11:14:58
【问题描述】:

我想从我的数据框的 4 列创建一个 3D 矩阵

输入:

df = pd.DataFrame({
  "u_id": [55218,55218,55218,55222],
  "i_id": [0,0,1,1],
  "Num": [0,2,1,2]
  "rating":[-1,2,0,2]})

x 轴:'u_id'; y轴:'i_id' z轴:'Num'

矩阵中的值应该是'rating'

结果应该是

[[[NaN,NaN],
  [-1 ,NaN]],
 [[NaN,NaN],
  [  0,NaN]],
 [[  2,NaN],
  [NaN,2]]]

到目前为止我尝试了什么:

x = df['u_id']
y = df['i_id']
z = df['Num']
value = df['rating']
Matrix = [[0 for m in len(z)] for m in len(z)] for c in len(x):

Matrix[c][r][m]= value

但这不起作用。

【问题讨论】:

  • 您的列表推导代码无效python,例如:range(df['u_id']) 不是您使用range 的方式,您缺少右括号,推导之外c 未定义.您的预期输出是什么?
  • 这将产生一个尺寸为(55223, 2, 3) 的3D 数组来存储四个值。并且将包含与您的数据框完全相同的信息。
  • 好的,我编辑了我的问题。我想要一个尺寸为 (2,2,3) 的 3D 数组
  • 您的预期输出形状为 (3,2,2)

标签: python pandas dataframe matrix 3d


【解决方案1】:

我认为您的预期输出并不代表您数据框中的信息。但是,如果您希望将 rating 的值与其他列一起放置为形状为 (3,2,2) 的 3D 数组中的索引

设置输入数据

import numpy as np
import pandas as pd

df = pd.DataFrame({
  "u_id": [55218,55218,55218,55222],
  "i_id": [0,0,1,1],
  "Num": [0,2,1,2],      # <-- here was a small typo in your code
  "rating":[-1,2,0,2]})
df

输出:

    u_id  i_id  Num  rating
0  55218     0    0      -1
1  55218     0    2       2
2  55218     1    1       0
3  55222     1    2       2

首先将u_id 转换为合适的索引

df['u_id'] = df['u_id'].astype('category').cat.codes
df[['Num','u_id','i_id','rating']] # order columns to correspond to coordinates

输出:

   Num  u_id  i_id  rating
0    0     0     0      -1
1    2     0     0       2
2    1     0     1       0
3    2     1     1       2

然后创建输出数组并填写rating

x = np.full(df[['Num','u_id','i_id']].nunique(), np.nan)
x[df['Num'], df['u_id'], df['i_id']] = df['rating']
x

输出:

array([[[-1., nan],
        [nan, nan]],

       [[nan,  0.],
        [nan, nan]],

       [[ 2., nan],
        [nan,  2.]]])

【讨论】:

  • 感谢您的回答。如果我想要数组中的 0 而不是 nan,我应该改变什么?
  • np.full(...) 中的np.nan 更改为0。此参数是输出数组的fill_value
  • 如果两者都需要,可以使用np.nan_to_num(x, 0)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-08
  • 1970-01-01
相关资源
最近更新 更多