首页 > 解决方案 > 如何将分段/部分中的 CSV 加载到嵌套列表/二维数组中?

问题描述

抱歉,如果我可能使用了错误的术语,但我试图弄清楚如何在一定数量的(时间)步骤中将 CSV 加载到嵌套列表/二维数组中。
所以如果我需要编辑/添加一些东西,请大声喊叫!

澄清一下......我的 CSV 的形状为 (63564, 78),其中包含已针对人类关节关键点进行处理的短视频文件:

import pandas as pd
keypoints = pd.read_csv('keypoints_new.csv')

Frame  ,  NoseX , NoseY  , NoseC   , SchoulderX ..., Label, MovementID
   1   , 901.059, 336.042, 0.935647,  901.166   ..., Plie , Plie_1
   2   , 901.027, 336.078, 0.938929,  901.162   ..., Plie , Plie_1
  ...
  113  , 880.452, 406.757, 0.972856,  904.148   ..., Plie , Plie_32
  ...
  80   , 902.089, 263.018, 0.958629,  845.364   ..., Jete , Jete_20
  ...

我希望上面的结构是有意义的,但基本上它是一个包含 75 行关节坐标的 #Frame per video (MovementID) 列表,最后是(3 个不同的)标签,它只是供以后使用的通用运动。对于我的深度学习网络,我想在嵌套列表/二维数组中以时间步长加载这些数据。
例如,如果我希望每个 MovementID 每 60 行/时间步加载 123 帧的帧,则结构将如下所示:

#random numbers
Plie_1 - 123 frames - 75 datapoints per line:
[[83, 91, 1, ..., 1253, 927],
[73, 8, 15, ..., 55, 927],
[711, 632, 71]]

Plie_2 - 184 frames:
[[124, 256, 8, ..., 1187, 987],
[37, 45, 13, ..., 12, 987],
[86, 4, 745, ..., 63, 196]
[452, 872, 91, 80]]
etc

剩余的行将使用 Keras 填充序列数据填充 0,以便它具有相同的长度,但这是以后的问题;)

我知道它可能是通过使用 for 循环来实现的,但目前我不知道如何在这些时间步中拆分它并将其直接转换为每个 MovementID 的嵌套列表。

标签: pythonpandascsvnested

解决方案


您可以使用 pandas 加载 csv,然后使用 MovementID 创建新的数据帧,然后使用 as_matrix() 将这些数据帧转换为 ndarray

例子:

import pandas as pd

a = [1, 2, 3, 4, 5, 6]
b = [1, 3, 4, 5, 6, 7]
c = ['a', 'b', 'a', 'c', 'd', 'b']
val = list(zip(a, b, c))
df = pd.DataFrame(val, columns=['num1', 'num2', 'MovementID'])

list_dfs = []
for v in df['MovementID'].unique().tolist():
    new_df = df[df['MovementID'] == v].drop(columns='MovementID').as_matrix()
    list_dfs.append(new_df)
    print('MovementID =', v)
    print(new_df)

输出:

MovementID = a
[[1 1]
 [3 4]]
MovementID = b
[[2 3]
 [6 7]]
MovementID = c
[[4 5]]
MovementID = d
[[5 6]]

推荐阅读