将行添加到Dataframe以统一组的长度

时间:2017-12-15 13:36:48

标签: python pandas dataframe group-by autofill

我想以选择的方式将元素添加到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

请注意,索引并不重要。

1 个答案:

答案 0 :(得分:1)

您可以按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