2017-12-15 3 views
1

팬더 데이터 프레임의 특정 그룹에 요소를 선택적으로 추가하고 싶습니다. 특히 모든 그룹의 수가 동일한 요소를 갖도록 0을 추가하고 싶습니다. I은 (그룹화가 key 열로 임) 그룹당 같은 수의 요소 싶은데이터 프레임에 행을 추가하여 그룹 길이를 통합하십시오.

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 

다음은 간단한 예이다. 그룹 2는 세 가지 요소가 가장 많습니다. 그러나 그룹 1에는 두 개의 요소 만 있으므로 0을 다음과 같이 추가해야합니다.

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

색인은 중요하지 않습니다. 당신은 cumcount에 의해 MultiIndex의 새로운 차원을 만든 다음 unstack/stack 또는 reindex에 의해 누락 된 값을 추가 할 수 있습니다

답변

1

:

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 
관련 문제