向 Dataframe 添加行以统一组的长度

Adding rows to a Dataframe to unify the length of groups

我想以选择性的方式将元素添加到 Pandas DataFrame 中的特定组。特别是,我想添加零,以便所有组都具有相同数量的元素。下面是一个简单的例子:

import pandas as pd
df = pd.DataFrame([[1,1], [2,2], [1,3], [2,4], [2,5]], columns=['key', 'value'])
df
   key  value
0    1      1
1    2      2
2    1      3
3    2      4
4    2      5

我希望每个组具有相同数量的元素(其中按 key 列分组)。第 2 组元素最多:三个元素。但是,第 1 组只有两个元素,因此应按如下方式添加零:

   key  value
0    1      1
1    2      2
2    1      3
3    2      4
4    2      5
5    1      0

请注意,索引无关紧要。

您可以通过 cumcount 创建 MultiIndex 的新级别,然后通过 unstack/stackreindex:

添加缺失值
df = (df.set_index(['key', df.groupby('key').cumcount()])['value']
       .unstack(fill_value=0)
       .stack()
       .reset_index(level=1, drop=True)
       .reset_index(name='value'))

备选方案:

df = df.set_index(['key', df.groupby('key').cumcount()]) 
mux = pd.MultiIndex.from_product(df.index.levels, names = df.index.names)
df = df.reindex(mux, fill_value=0).reset_index(level=1, drop=True).reset_index()

print (df)
   key  value
0    1      1
1    1      3
2    1      0
3    2      2
4    2      4
5    2      5

如果是值的重要顺序:

df1 = df.set_index(['key', df.groupby('key').cumcount()]) 

mux = pd.MultiIndex.from_product(df1.index.levels, names = df1.index.names)
#get appended values
miss = mux.difference(df1.index).get_level_values(0)

#create helper df and add 0 to all columns of original df
df2 = pd.DataFrame({'key':miss}).reindex(columns=df.columns, fill_value=0)
#append to original df
df = pd.concat([df, df2], ignore_index=True)

print (df)
   key  value
0    1      1
1    2      2
2    1      3
3    2      4
4    2      5
5    1      0