Python 如何在索引编号固定的数据帧中填充0?
我想对一些数据表(dataframe或ndarray)使用CNN 但我在每个索引中有不同的行数据 资料来源:Python 如何在索引编号固定的数据帧中填充0?,python,pandas,numpy,keras,Python,Pandas,Numpy,Keras,我想对一些数据表(dataframe或ndarray)使用CNN 但我在每个索引中有不同的行数据 资料来源: mIndex valueA valueB ------ ------ -------- 1 111 10 1 112 20 2 222 30 2 221 40 2 223 50 3
mIndex valueA valueB
------ ------ --------
1 111 10
1 112 20
2 222 30
2 221 40
2 223 50
3 333 60
希望:(每个索引最多3行)
我想为CNN兜售做这件事
但在numpy或keras pedding功能中有可能做到这一点吗
请帮忙。
提前谢谢。我只能用一种愚蠢的方式来做,也许有人有更好的解决方案:
# 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
方法1
首先应用np.array
获取数组,然后应用pd.Series
基本上将每列的值旋转到一行,这样我们就可以使用堆栈进行转换。
之后,我们使用堆栈
,并保留NaN
最后,我们将所有数据帧集中到轴=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
方法2
我们可以访问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
@尔凡怎么了?点菜?您可以再次使用groupby。添加
df=pd.concat([df,pads],ignore_index=True)。排序值('mIndex')
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