我想以选择的方式将元素添加到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
请注意,索引并不重要。
答案 0 :(得分:1)
您可以按cumcount
创建MultiIndex
的新级别,然后按unstack/stack
或reindex
添加缺失值:
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