我想对某些数据表(数据帧或ndarray)使用CNN 但我在每个索引中都有不同的行数据。
来源:
return $arr->sortByDesc('weight')->values();
希望:(每个索引最多3行)
mIndex valueA valueB
------ ------ --------
1 111 10
1 112 20
2 222 30
2 221 40
2 223 50
3 333 60
我想为CNN骑行做这件事。
但是可以在numpy或keras pedding函数中做到这一点吗?
请帮助。 预先感谢。
答案 0 :(得分:1)
首先应用np.array
获取数组,然后应用pd.Series
基本将每列的值旋转到一行,以便我们可以使用堆栈进行转换。
之后,我们使用stack
并保留NaN
。
最后,我们在concat
上将所有数据帧axis=1
转换为一个最终数据帧
cols = ['valueA', 'valueB']
dfs = []
for col in cols:
dfs.append(df.groupby('mIndex')[col].apply(np.array)
.apply(pd.Series)
.stack(dropna=False).reset_index(level=0)
.rename({0:col}, axis=1))
df_final = pd.concat(dfs, axis=1).reset_index(drop=True)
print(df_final)
mIndex valueA mIndex valueB
0 1 111.0 1 10.0
1 1 112.0 1 20.0
2 1 NaN 1 NaN
3 2 222.0 2 30.0
4 2 221.0 2 40.0
5 2 223.0 2 50.0
6 3 333.0 3 60.0
7 3 NaN 3 NaN
8 3 NaN 3 NaN
我们可以添加groupby
元素
df= pd.concat([
d.reset_index(drop=True).reindex(range(3))
for n, d in df.groupby('mIndex')
], ignore_index=True)
print(df)
mIndex valueA valueB
0 1.0 111.0 10.0
1 1.0 112.0 20.0
2 NaN NaN NaN
3 2.0 222.0 30.0
4 2.0 221.0 40.0
5 2.0 223.0 50.0
6 3.0 333.0 60.0
7 NaN NaN NaN
8 NaN NaN NaN
答案 1 :(得分:0)
我只能以愚蠢的方式做到这一点,也许有人有更好的解决方案:
# df
mIndex valueA valueB
0 1 a a
1 2 b b
2 2 b b
3 3 c c
我们在这里:
# get number of required padding
nPad = df.groupby('mIndex').mIndex.count().transform(lambda x: 3-x)
# get paddings
pads = []
for i, row in nPad.items():
for _ in range(row):
pads.append([i, 0, 0])
pads = pd.DataFrame(pads, columns=df.columns)
# padding
df = pd.concat([df, pads], ignore_index=True)
.set_index('mIndex').sort_values('mIndex')
填充后:
mIndex valueA valueB
1 a a
1 0 0
1 0 0
2 b b
2 b b
2 0 0
3 c c
3 0 0
3 0 0