다른 데이터 프레임의 열 헤더 멤버십을 기반으로 (날짜 별) Pandas 데이터 프레임의 부울 값 설정 (날짜 별)

tmasters

두 개의 팬더 데이터 프레임 (X 및 Y)이 있고 X 축과 Y의 열 / 구성 요소 간의 상호 관계를 기반으로 세 번째 (Z)를 부울 값으로 채우려 고합니다. 중첩 루프를 통해서만이 작업을 수행 할 수있었습니다. 코드는 내 장난감 예제에서 작동하지만 실제 데이터 세트에는 너무 느립니다.

# define X, Y and Z
idx=pd.date_range('2016-1-31',periods=3,freq='M')
codes = list('ABCD')
X = np.random.randn(3,4)
X = pd.DataFrame(X,columns=codes,index=idx)

Y = [['A','A','B'],['C','B','C'],['','C','D']]
Y = pd.DataFrame(Y,columns=idx)

Z = pd.DataFrame(columns=X.columns, index=X.index)

보시다시피 X의 색인은이 예에서 Y의 열과 일치합니다. 내 실제 예에서 Y의 열은 X 인덱스의 하위 집합입니다.

Z 축은 X 축과 일치합니다. Z의 열 머리글이 Z의 인덱스와 같은 머리글이있는 Y의 열에있는 경우 Z의 요소를 True로 채우고 싶습니다. 내 작업 코드는 다음과 같습니다.

for r in Y:
    for c in Z:
        Z.loc[r,c] = c in Y[r].values

코드는 매우 깨끗하고 짧지 만 더 큰 데이터 세트에서 실행하는 데 오랜 시간이 걸립니다. 나는 훨씬 더 빨리 똑같은 것을 달성하기 위해 벡터화 된 방법이 있기를 바랍니다.

어떤 도움이라도 대단히 감사하겠습니다.

감사!

이스 르엘

stackDataFrame의 값은 열로, 열은 DataFrame의 값으로 변환되는 메서드 를 사용할 수 있습니다 . 마지막 테스트 NaNnotnull:

print (Y.replace({'':np.nan})
        .stack()
        .reset_index(0)
        .set_index(0, append=True)
        .squeeze()
        .unstack()
        .rename_axis(None, axis=1)
        .notnull())

                A      B     C      D
2016-01-31   True  False  True  False
2016-02-29   True   True  True  False
2016-03-31  False   True  True   True

다른 솔루션 pivot:

print (Y.replace({'':np.nan})
        .stack()
        .reset_index(name='a')
        .pivot(index='level_1', columns='a', values='level_0')
        .rename_axis(None, axis=1)
        .rename_axis(None)        
        .notnull())

                A      B     C      D
2016-01-31   True  False  True  False
2016-02-29   True   True  True  False
2016-03-31  False   True  True   True

댓글로 수정 :

reindex인덱스가 고유 한 경우 다음 기준 fillna사용하십시오 False.

import pandas as pd
import numpy as np

# define X, Y and Z
idx=pd.date_range('2016-1-31',periods=5,freq='M')
codes = list('ABCD')
X = np.random.randn(5,4)
X = pd.DataFrame(X,columns=codes,index=idx)

Y = [['A','A','B'],['C','B','C'],['','C','D']]
Y = pd.DataFrame(Y,columns=idx[:3])
Z = pd.DataFrame(columns=X.columns, index=X.index)

print (X)
                   A         B         C         D
2016-01-31  0.810348 -0.737780 -0.523869 -0.585772
2016-02-29 -1.126655 -0.494999 -1.388351  0.460340
2016-03-31 -1.578155  0.950643 -1.699921  1.149540
2016-04-30 -2.320711  1.263740 -1.401714  0.090788
2016-05-31  1.218036  0.565395  0.172278  0.288698

print (Y)
  2016-01-31 2016-02-29 2016-03-31
0          A          A          B
1          C          B          C
2                     C          D

print (Z)
              A    B    C    D
2016-01-31  NaN  NaN  NaN  NaN
2016-02-29  NaN  NaN  NaN  NaN
2016-03-31  NaN  NaN  NaN  NaN
2016-04-30  NaN  NaN  NaN  NaN
2016-05-31  NaN  NaN  NaN  NaN
Y1 = Y.replace({'':np.nan})
      .stack()
      .reset_index(name='a')
      .pivot(index='level_1', columns='a', values='level_0')
      .rename_axis(None, axis=1)
      .rename_axis(None)
      .notnull()
print (Y1)
                A      B     C      D
2016-01-31   True  False  True  False
2016-02-29   True   True  True  False
2016-03-31  False   True  True   True

print (Y1.reindex(X.index).fillna(False))
                A      B      C      D
2016-01-31   True  False   True  False
2016-02-29   True   True   True  False
2016-03-31  False   True   True   True
2016-04-30  False  False  False  False
2016-05-31  False  False  False  False

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관