熊猫数据框到3D阵列

时间:2020-08-23 19:17:52

标签: python pandas numpy

我有一个这样的数据框

group           b             c           d           e        label
A           0.577535    0.299304    0.617103    0.378887       1
            0.167907    0.244972    0.615077    0.311497       0
B           0.640575    0.768187    0.652760    0.822311       0
            0.424744    0.958405    0.659617    0.998765       1
            0.077048    0.407182    0.758903    0.273737       0

我想使用填充将其重塑为3D数组,LSTM可以将其用作输入。因此,A组应该输入长度为3(填充后)的序列,B组应该输入长度为3的序列。所需的输出类似

array1 = [[[0.577535, 0.299304, 0.617103, 0.378887],
          [0.167907, 0.244972, 0.615077, 0.311497],
          [0, 0, 0, 0]],
         [[0.640575, 0.768187, 0.652760, 0.822311],
          [0.424744, 0.958405, 0.659617, 0.998765],
          [0.077048, 0.407182, 0.758903, 0.273737]]]

然后标签也必须进行相应的重塑

array2 = [[1,
           0,
           0],
          [0,
           1,
           0]]

如何放置填充并重塑数据?

2 个答案:

答案 0 :(得分:1)

您可以首先使用cumcount为每个组创建一个计数,reindexMultiIndex.from_product并填充0,最后导出到列表:

df["count"] = df.groupby("group")["label"].cumcount()
mux = pd.MultiIndex.from_product([df["group"].unique(), range(max(df["count"]+1))], names=["group","count"])

df = df.set_index(["group","count"]).reindex(mux, fill_value=0)

print (df.iloc[:,:4].groupby(level=0).apply(pd.Series.tolist).values.tolist())

[[[0.577535, 0.299304, 0.617103, 0.378887],
  [0.167907, 0.24497199999999997, 0.6150770000000001, 0.31149699999999997],
  [0.0, 0.0, 0.0, 0.0]],
 [[0.640575, 0.768187, 0.65276, 0.822311],
  [0.42474399999999995, 0.958405, 0.659617, 0.998765],
  [0.077048, 0.40718200000000004, 0.758903, 0.273737]]]

print (df.groupby(level=0)["label"].apply(list).tolist())

[[1, 0, 0], [0, 1, 0]]

答案 1 :(得分:0)

我假设您的group列包含许多值,而不仅仅是1'A'和1'B'。这段代码对我有用,您也可以尝试一下:

import pandas as pd

df = pd.read_csv('file2.csv')
vals = df['group'].unique()

array1 = []
array2 = []

for val in vals:
    
    val_df = df[df.group == val]
    val_label = val_df.label
    smaller_array = []
    
    label_small_array = []
    
    for label in val_label:
        label_small_array.append(label)
        
    array2.append(label_small_array)
    
    for i in range(val_df.shape[0]):
        smallest_array = []
        
        for j in val_df.columns:
            smallest_array.append(j)
        
        smaller_array.append(smallest_array)
    
    array1.append(smaller_array)