Pandas에서 새 열을 만들어 별도의 값을 저장합니다.

Nov 13 2020
ID    onevalue  twovalue 
ABC   0.568      0.004
ABC   5.620     -2.514
ABC   -1.551    -0.452
LMN   14.56      7.456  
LMN   6.750      2.896         
LMN   5.620      1.166                   
LMN   8.640      3.486   

위의 데이터 프레임을 기반으로 다음과 같은 기능이 있습니다.

cond = (df.onevalue > df.twovalue)
df['S'] = np.where(cond, df.onevalue,"")

이것은 잘 작동하며 새로운 'S'데이터 프레임 / 시리즈에서 적절한 'onevalue'를 제공합니다.

내가 지금하려는 것은 여러 개의 'S'열을 만들고 주어진 "ID"에 대해 열당 하나의 'onevalue'변수 만 넣으려는 것입니다. 열 생성은 새 ID가 나타난 후 다시 시작되어야하며 반복 된 값은 계산되지 않아야합니다. 명확성을 위해 의도 된 결과는 다음과 같습니다.

ID    onevalue  twovalue    S      S1     S2
ABC   0.568      0.004    0.568
ABC   5.620     -2.514          5.620 
ABC   -1.551    -0.452
LMN   14.56      7.456    14.56
LMN   6.750      2.896          6.750
LMN   5.620      1.166                   
LMN   8.640      3.486                  8.640

팬더가 정의되지 않은 열 생성을 허용하는지 확실하지 않습니다.이 경우 ID 당 최대 7 개의 열을 가정 할 수 있습니다.

나는 그것을 해결하려고 노력했지만 운이 없다. 약간의 도움을 주시면 감사하겠습니다.

감사!

답변

1 QuangHoang Nov 13 2020 at 20:44

예, 내부 ID및 스택 해제 내에서 상대적 순서로 행을 열거 할 수 있습니다 .

df.join(pd.DataFrame({'S':np.maximum(df.onevalue, df.twovalue),
              'idx': df.groupby('ID').cumcount()})
   .set_index('idx',append=True)['S']
   .unstack('idx').fillna('').add_prefix('S')
)

산출:

    ID  onevalue  twovalue     S0    S1     S2    S3
0  ABC     0.568     0.004  0.568                   
1  ABC     5.620    -2.514         5.62             
2  ABC    -1.551    -0.452              -0.452      
3  LMN    14.560     7.456  14.56                   
4  LMN     6.750     2.896         6.75             
5  LMN     5.620     1.166                5.62      
6  LMN     8.640     3.486                      8.64