>

aa가 (ww + zz)의 합인 5 개의 열이있는 다음 df가 있습니다.

    xx    yy    ww   zz  aa
A    5     3     4    2   6  
B    2     0     4    1   5
C    3     0     4    2   6
D    3     2     3    3   6

yy 열의 값이 0 일 때마다 zz의 값을 ww에 추가하고 ww의 값을 0으로 설정하고 zz의 값이 0과 다른 경우 그대로 두십시오.

원하는 결과는 :

    xx    yy    ww   zz  aa
A    5     3     4    2   6  
B    2     0     5    0   5
C    3     0     6    0   6  
D    3     2     3    3   6

  • 답변 # 1

    이것이 당신이 무엇을하고 있습니까?

    df[['ww', 'zz']] = (
        df.apply(lambda x: [x.zz+x.ww, 0] if x.yy==0 else [x.ww, x.zz], axis=1)
        .apply(pd.Series)
    )
        xx  yy  ww  zz  aa
    A   5   3   4   2   6
    B   2   0   5   0   5
    C   3   0   6   0   6
    D   3   2   3   3   6
    
    

    성능이 중요한 경우이 버전을 사용하십시오 :

    (
        df.assign(y=df.yy.eq(0))
        .assign(ww=lambda x: x.zz.mul(x.y).add(x.ww))
        .assign(zz=lambda x: x.zz.mul(~x.y))
        .drop('y', axis=1)
    )
    
    

  • 답변 # 2

    이것을 시도해보십시오 :

    >>> df=pd.DataFrame(data={"xx": [5,2,3,3], "yy": [3,0,0,2], "ww": [4,4,4,3], "zz": [2,1,2,3], "aa": [6,5,6,6]}, index=["A", "B", "C", "D"])
    >>> df["ww"][df["yy"]==0]=df["ww"]+df["zz"]
    >>> df["zz"][df["yy"]==0]=0
    >>> df
       xx  yy  ww  zz  aa
    A   5   3   4   2   6
    B   2   0   5   0   5
    C   3   0   6   0   6
    D   3   2   3   3   6
    
    

  • 답변 # 3

    yy 로 행을 식별하는 마스크 만들기  열 eq에서 0 로   where 를 사용하십시오.  조건을 적용합니다.

    mask_0 = df['yy'].eq(0)
    df['ww'] = df['zz'].where(mask_0,0) + df['ww']
    df['zz'] = df['zz'].where(~mask_0,0)
    
    

  • 답변 # 4

    np.where 사용  조건부로 zz 를 추가하려면   ww 로  그리고 mask   zz 의 값을 바꾸려면   0 와 함께  만약 yy == 0 :

    m = df['yy'].eq(0)
    df['ww'] = np.where(m, df['ww'].add(df['zz']), df['ww'])
    df['zz'] = df['zz'].mask(m, 0)
    
    

    출력

      xx  yy  ww  zz  aa
    0   5   3   4   2   6
    1   2   0   5   0   5
    2   3   0   6   0   6
    3   3   2   3   3   6
    
    
    <시간>

    타이밍 테스트

    df = pd.concat([df]*200000, ignore_index=True)
    
    

    어판

    %%timeit
    m = df['yy'].eq(0)
    df['ww'] = np.where(m, df['ww'].add(df['zz']), df['ww'])
    df['zz'] = df['zz'].mask(m, 0)
    13.8 ms ± 112 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
    
    

    앨런

    %%timeit
    (
        df.assign(y=df.yy.eq(0))
        .assign(ww=lambda x: x.zz.mul(x.y).add(x.ww))
        .assign(zz=lambda x: x.zz.mul(~x.y))
        .drop('y', axis=1)
    )
    
    31.3 ms ± 2.36 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
    
    

관련 자료

  • 이전 루프 목록에서 효과적인 파이썬 멀티 프로세싱
  • 다음 javascript - 무슨 의미인지 설명하십시오 js의 의미