다음은 제 문제를 재현 한 작업 예제입니다.팬더 : multiindex로 fillna() 메서드 - NaN이 잘못된 열로 채워짐
다음#Generate some random data and data that will be used to fill the nans
data = np.random.random((100,6))
fill_data = np.vstack((np.ones(200), np.ones(200)*2, np.ones(200)*3,np.ones(200), np.ones(200)*2, np.ones(200)*3)).T
#Generate indices of nans that we will put in
nan_rows = np.random.randint(0,100,50)
nan_cols = np.random.randint(0,6,50)
nan_idx = np.vstack((nan_rows,nan_cols)).T
#Put in nan values
for r,c in nan_idx:
data[r,c] = np.nan
#Generate multiindex and datetimeindex for both the data and fill_data
multi = pd.MultiIndex.from_product([['A','B'],['one','two','three']])
idx1 = pd.DatetimeIndex(start='1990-01-01', periods=100, freq='d')
idx2 = pd.DatetimeIndex(start='1989-12-01', periods=200, freq='d')
#Construct dataframes
df1 = pd.DataFrame(data, idx1, multi)
df2 = pd.DataFrame(fill_data, idx2, multi)
#fill nans from df1 with df2
df1 = df1.fillna(df2, axis=1)
이 결과 프레임이 어떻게 생겼는지입니다 :
In [167]:
df1.head()
Out[167]:
A B
one two three one two three
1990-01-01 1.000000 0.341803 0.694128 0.382164 0.326956 0.506616
1990-01-02 0.439024 0.552746 0.538489 0.003906 0.968498 0.816289
1990-01-03 0.200252 0.838014 0.805633 0.008980 0.269189 0.016243
1990-01-04 0.735120 0.384871 0.579268 0.561657 0.630314 0.361932
1990-01-05 0.938185 0.335212 0.678310 2.000000 0.819046 0.482535
In [168]:
df2.head()
Out[168]:
A B
one two three one two three
1989-12-01 1 2 3 1 2 3
1989-12-02 1 2 3 1 2 3
1989-12-03 1 2 3 1 2 3
1989-12-04 1 2 3 1 2 3
1989-12-05 1 2 3 1 2 3
그래서 여기에 키가 있다는 것입니다 우선 몇 가지 임의의 데이터는 우리가하는 NaN을 채우기 위해 사용하는 데이터와 함께 생성된다 데이터 프레임은 길이가 다르지만 다중 색인 열이 동일하고 df1의 타임 스탬프 레이블이 df2 내에 있다는 점에서 공통 레이블을 갖습니다. '두 면밀히 살펴보면
In [165]:
df1
Out[165]:
A B
one two three one two three
1990-01-01 1.000000 0.341803 0.694128 0.382164 0.326956 0.506616
1990-01-02 0.439024 0.552746 0.538489 0.003906 0.968498 0.816289
1990-01-03 0.200252 0.838014 0.805633 0.008980 0.269189 0.016243
1990-01-04 0.735120 0.384871 0.579268 0.561657 0.630314 0.361932
1990-01-05 0.938185 0.335212 0.678310 2.000000 0.819046 0.482535
1990-01-06 0.609736 0.164815 0.295003 0.784388 3.000000 3.000000
1990-01-07 1.000000 0.394105 0.430608 0.782029 0.327485 0.855130
1990-01-08 0.573780 0.525845 0.147302 0.091022 3.000000 3.000000
1990-01-09 0.591646 0.651251 0.649255 0.205926 3.000000 0.606428
1990-01-10 0.988085 0.524769 0.481834 0.486241 0.629223 0.575843
1990-01-11 1.000000 0.586813 0.592252 0.309429 0.877121 0.547193
1990-01-12 0.853000 0.097981 0.970053 0.519838 0.828266 0.618965
1990-01-13 0.579778 0.805140 0.050559 0.432795 0.036241 0.081218
1990-01-14 0.055462 1.000000 0.159151 0.538137 3.000000 0.296754
1990-01-15 0.848238 0.697454 0.519403 0.232734 0.612487 0.891230
1990-01-16 0.808238 0.182904 0.480846 0.052806 0.900373 0.860274
1990-01-17 0.890997 0.346767 0.265168 0.486746 0.983999 0.104035
1990-01-18 0.673155 0.248853 0.245246 2.000000 0.965884 0.295021
1990-01-19 0.074864 0.714846 2.000000 0.046031 0.105930 0.641538
1990-01-20 1.000000 0.486893 0.464024 0.499484 0.794107 0.868002
는 ('A '를'1)과 동일한 값 열이 있다는 것을 볼 수 있고 ('A': 여기
이 결과 ('B', '2')와 ('B', '3')의 값이 3 인 값은 'A', ' ').
예상 출력은 '하나'열에서 하나의 값이 될 것이다는 '이'열에서 2 등
은 내가 잘못 여기서 뭔가를하고 있습니까? 나에게 이것은 어떤 종류의 버그처럼 보인다.
흠, 왜 돈 ' 이 문제에 대해 github에서 문제를 열지 마십시오. – Jeff
이 동작이 놀라운 것이며 버그처럼 보입니다. DateTimeIndex 나 MultiIndex를 사용하지 않고 훨씬 간단한 예제로 재현 할 수 있습니다. @Jeff :'df1.fillna (df2)'가 무엇을해야하는지 정확히 설명하는 문서를 가르쳐 주시겠습니까? – BrenBarn
http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.fillna.html?highlight=fillna#pandas.DataFrame.fillna. 기술적으로 이것은 구현되지 않습니다 :). 두 프레임의 블록 (dtypes)을 정렬해야하기 때문에 실제로는 매우 복잡합니다. 확실히 테스트되지 않았습니다. 문제를 제기 해 봅시다. 어쩌면 단기적으로 NotImplementedError를 올릴 수도 있습니다. (만약 Pls가 pull-request를한다면) – Jeff