Python 如何在索引编号固定的数据帧中填充0?

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

我想对一些数据表(dataframe或ndarray)使用CNN 但我在每个索引中有不同的行数据

资料来源:

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