将 ndarrays 列表转换为数据框

Transform list of ndarrays into dataframe

我有一个 ndarray 列表,我想将其转换为 pd.dataframe。该列表如下所示:

from numpy import array
l = [array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
            0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0,
            0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0]),
     array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0]),
     array([0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1])
     ]

ndarrays 的长度是 12(12 个月)的倍数,在本例中它等于 36。我希望最终输出如下所示:

Year Jan Feb March April May
1 0 0 0 0 0
2 0 1 1 0 0
3 0 0 1 0 0
1 0 0 0 0 0
2 0 0 0 0 0
3 0 0 0 0 0
1 0 0 1 0 0
2 1 1 0 0 1
3 0 0 0 0 0

重塑

假设输入l,可以使用:

from calendar import month_abbr
df = (pd.DataFrame(np.vstack(l).reshape(-1, 12),
                   columns=month_abbr[1:])
     )
df.insert(0, 'year', np.tile(range(1, len(l[0])//12+1), len(l)))
print(df)

或:

df = pd.DataFrame(np.hstack([np.tile(range(1, len(l[0])//12+1), len(l))[:,None],
                             np.vstack(l).reshape(-1, 12)]),
                  columns=['year']+month_abbr[1:])

输出:

   year  Jan  Feb  Mar  Apr  May  Jun  Jul  Aug  Sep  Oct  Nov  Dec
0     1    0    0    0    0    0    0    0    0    0    0    0    1
1     2    0    1    1    0    0    1    0    0    0    0    0    0
2     3    0    0    1    0    0    0    0    0    0    1    0    0
3     1    0    0    0    0    0    0    0    0    0    0    0    0
4     2    0    0    0    0    0    0    0    0    0    0    0    0
5     3    0    0    0    0    0    0    0    0    0    1    1    0
6     1    0    0    1    0    0    0    0    0    0    0    0    0
7     2    1    1    0    0    1    0    0    0    1    1    0    0
8     3    0    0    0    0    0    0    0    0    0    0    0    1

上一个答案:聚合

假设 l 输入列表并且每个列表代表连续的月份以形成 3 年,您可以 vstack、聚合(此处使用 max)并在转换为之前重塑数据框:

from calendar import month_abbr
df = pd.DataFrame(np.vstack(l).reshape(len(l), -1, 12).max(axis=0),
                  columns=month_abbr[1:])

输出:

   Jan  Feb  Mar  Apr  May  Jun  Jul  Aug  Sep  Oct  Nov  Dec
0    0    0    1    0    0    0    0    0    0    0    0    1
1    1    1    1    0    1    1    0    0    1    1    0    0
2    0    0    1    0    0    0    0    0    0    1    1    1

由于您想要聚合的方式不明确,您还可以使用不同的轴:

pd.DataFrame(np.vstack(l).reshape(len(l), -1, 12).max(axis=1),
             columns=month_abbr[1:])

输出:

   Jan  Feb  Mar  Apr  May  Jun  Jul  Aug  Sep  Oct  Nov  Dec
0    0    1    1    0    0    1    0    0    0    1    0    1
1    0    0    0    0    0    0    0    0    0    1    1    0
2    1    1    1    0    1    0    0    0    1    1    0    1