如何将2D numpy数组转换为具有给定类别的pandas数据框?

时间:2018-11-29 14:01:41

标签: python pandas numpy

我有一个名为“值”的数组,其中包含2列来自10个人的平均反应时间数据。第一列是针对条件A中的单个个体收集的数据,第二列是针对条件B中的同一个体收集的数据:

array([[451.75      , 488.55555556],
   [552.44444444, 590.40740741],
   [629.875     , 637.62962963],
   [454.66666667, 421.88888889],
   [637.16666667, 539.94444444],
   [538.83333333, 516.33333333],
   [463.83333333, 448.83333333],
   [429.2962963 , 497.16666667],
   [524.66666667, 458.83333333]])

我想使用seaborn绘制这些数据,以显示两个条件下每个人的平均值和相连的单个值。将数组“值”转换为3列DataFrame的最简单方法是什么,其中一列包含所有值,另一列包含将值区分为条件A或条件B的标签,最后一列为每个值提供一个数字个人(即1-10)?例如,如下:

Value    Condition    Individual
451.75   A            1
488.56   B            1
488.55   A            2

...等

2 个答案:

答案 0 :(得分:3)

这应该有效

import pandas as pd
import numpy as np
np_array = np.array([[451.75      , 488.55555556],
   [552.44444444, 590.40740741],
   [629.875     , 637.62962963],
   [454.66666667, 421.88888889],
   [637.16666667, 539.94444444],
   [538.83333333, 516.33333333],
   [463.83333333, 448.83333333],
   [429.2962963 , 497.16666667],
   [524.66666667, 458.83333333]])
pd_df = pd.DataFrame(np_array, columns=["A", "B"])
num_individuals = len(pd_df.index)
pd_df = pd_df.melt()
pd_df["INDIVIDUAL"] = [(i)%(num_individuals) + 1 for i in pd_df.index]
pd_df
   variable       value  INDIVIDUAL
0         A  451.750000           1
1         A  552.444444           2
2         A  629.875000           3
3         A  454.666667           4
4         A  637.166667           5
5         A  538.833333           6
6         A  463.833333           7
7         A  429.296296           8
8         A  524.666667           9
9         B  488.555556           1
10        B  590.407407           2
11        B  637.629630           3
12        B  421.888889           4
13        B  539.944444           5
14        B  516.333333           6
15        B  448.833333           7
16        B  497.166667           8
17        B  458.833333           9

答案 1 :(得分:1)

melt

您可以使用pd.melt

pd.DataFrame(data, columns=['A','B']).reset_index().melt(id_vars = 'index')\
    .rename(columns={'index':'Individual'})

 Individual variable       value
0            0        A  451.750000
1            1        A  552.444444
2            2        A  629.875000
3            3        A  454.666667
4            4        A  637.166667
5            5        A  538.833333
6            6        A  463.833333
7            7        A  429.296296
8            8        A  524.666667
9            0        B  488.555556
10           1        B  590.407407
11           2        B  637.629630
12           3        B  421.888889
13           4        B  539.944444
14           5        B  516.333333
15           6        B  448.833333
16           7        B  497.166667
17           8        B  458.833333