将 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
我有一个 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