dtypes는 축 1에서 이동할 때 일을 뭉칩니다 (열)


9

데이터 프레임 고려 df

df = pd.DataFrame(dict(A=[1, 2], B=['X', 'Y']))

df

   A  B
0  1  X
1  2  Y

내가 이동하면 axis=0(기본값)

df.shift()

     A    B
0  NaN  NaN
1  1.0    X

예상대로 모든 행을 한 행 아래로 밀어 넣습니다.

하지만 내가 따라갈 때 axis=1

df.shift(axis=1)

    A    B
0 NaN  NaN
1 NaN  NaN

내가 예상했을 때 모든 것이 null입니다.

     A  B
0  NaN  1
1  NaN  2

왜 이런 일이 일어 났는지 이해합니다. 의 경우 axis=0, Pandas는 각 열이 단일 인 열 단위로 작동 하며 시작시 또는 끝에서 dtype도입 된 NaN값 을 처리하는 방법에 대한 명확한 프로토콜이 있습니다. 그러나 함께 움직일 때 한 열에서 다음 열로 axis=1의 잠재적 모호성을 도입 dtype합니다. 이 경우 열에 힘 int64을 주려고하는데 objectPandas는 값을 null로 결정합니다.

(가) 할 때 더 문제가된다 dtypes있습니다 int64float64

df = pd.DataFrame(dict(A=[1, 2], B=[1., 2.]))

df

   A    B
0  1  1.0
1  2  2.0

그리고 같은 일이

df.shift(axis=1)

    A   B
0 NaN NaN
1 NaN NaN

내 질문

결과가 값과 dtype을 이동 한 상태에서 이동되는 데이터 프레임을 작성하기위한 좋은 옵션 은 무엇입니까 axis=1?

를 들어 int64/ float64케이스 결과는 같을 것이다 :

df_shifted

     A  B
0  NaN  1
1  NaN  2

df_shifted.dtypes

A    object
B     int64
dtype: object

보다 포괄적 인 예

df = pd.DataFrame(dict(A=[1, 2], B=[1., 2.], C=['X', 'Y'], D=[4., 5.], E=[4, 5]))

df

   A    B  C    D  E
0  1  1.0  X  4.0  4
1  2  2.0  Y  5.0  5

이렇게 보일 것입니다

df_shifted

     A  B    C  D    E
0  NaN  1  1.0  X  4.0
1  NaN  2  2.0  Y  5.0

df_shifted.dtypes

A     object
B      int64
C    float64
D     object
E    float64
dtype: object

나에게 버그처럼 보이는데, 모든 열의 dtype을 만들면 어떻게됩니까 object?
EdChum

효과가있다. 이미 몇 가지 해결 방법이 있습니다. 나는 단지 몇 가지 아이디어를 위해 커뮤니티를 파고 있습니다.
piRSquared

나는 이것을 이슈로 제출할 것이다. 그들은 적어도 다음과 같은 혼합 dtype에 dtype 승격을위한 옵션을 제공해야한다.object
EdChum

지금 할게요
piRSquared

1
@ EdChum-ReinstateMonica 잠깐만! 시프트는 blocks>. <대신에 이것을 사용하고 참조하십시오df = pd.DataFrame(dict(A=[1, 2], B=[3., 4.], C=['X', 'Y'], D=[5., 6.], E=[7, 8], F=['W', 'Z']))
piRSquared

답변:


7

판다가 비슷한 블록 위로 이동하고 있음이 밝혀졌습니다. dtypes

정의 df

df = pd.DataFrame(dict(
    A=[1, 2], B=[3., 4.], C=['X', 'Y'],
    D=[5., 6.], E=[7, 8], F=['W', 'Z']
))

df

#  i    f  o    f  i  o
#  n    l  b    l  n  b
#  t    t  j    t  t  j
#
   A    B  C    D  E  F
0  1  3.0  X  5.0  7  W
1  2  4.0  Y  6.0  8  Z

정수를 다음 정수 열로 옮기고, 수레를 다음 float 열로, 객체를 다음 객체 열로 옮깁니다.

df.shift(axis=1)

    A   B    C    D    E  F
0 NaN NaN  NaN  3.0  1.0  X
1 NaN NaN  NaN  4.0  2.0  Y

좋은 생각인지는 모르겠지만, 그 입니다 무슨 일이 일어나고 있는지.


구혼

astype(object) 먼저

dtypes = df.dtypes.shift(fill_value=object)
df_shifted = df.astype(object).shift(1, axis=1).astype(dtypes)

df_shifted

     A  B    C  D    E  F
0  NaN  1  3.0  X  5.0  7
1  NaN  2  4.0  Y  6.0  8

transpose

그것을 만들 것입니다 object

dtypes = df.dtypes.shift(fill_value=object)
df_shifted = df.T.shift().T.astype(dtypes)

df_shifted

     A  B    C  D    E  F
0  NaN  1  3.0  X  5.0  7
1  NaN  2  4.0  Y  6.0  8

itertuples

pd.DataFrame([(np.nan, *t[1:-1]) for t in df.itertuples()], columns=[*df])

     A  B    C  D    E  F
0  NaN  1  3.0  X  5.0  7
1  NaN  2  4.0  Y  6.0  8

아마 이걸 할 것 같지만

pd.DataFrame([
    (np.nan, *t[:-1]) for t in
    df.itertuples(index=False, name=None)
], columns=[*df])

4
이것은 확실히 나에게 버그이 무효화 키 입력 열을 갖는 N에 의해 이동의 요점은 열이 많다는 배치
EdChum

1
회의 후 문제를 게시하겠습니다.
19

이 모두 있다면 str다음 dytpes을 당신이에 동일한 작업을 수행하는 경우 df라고, 제대로 작동 df = pd.DataFrame(dict(C=['X', 'Y'], D=[5., 6.], E=[7, 8], F=['W', 'Z']))는 이동 'XY'에 열을 모든 방법을 'F'열이 내 팬더의 버전이 확실히 나에게 잘못 0.24.2이 할 shoudl, dtype승진 등의 열을 이동하지 방법
EdChum


1

numpy방법을 사용해 보았습니다 . 이 방법은 데이터를 numpy 배열로 유지하는 한 작동합니다.

def shift_df(data, n):
    shifted = np.roll(data, n)
    shifted[:, :n] = np.NaN

    return shifted

shifted(df, 1)

array([[nan, 1, 1.0, 'X', 4.0],
       [nan, 2, 2.0, 'Y', 5.0]], dtype=object)

그러나 DataFrame생성자 를 호출 object하면 배열의 값이 다음 과 같지만 모든 열이로 변환됩니다 float, int, object.

def shift_df(data, n):
    shifted = np.roll(data, n)
    shifted[:, :n] = np.NaN
    shifted = pd.DataFrame(shifted)

    return shifted

print(shift_df(df, 1),'\n')
print(shift_df(df, 1).dtypes)

     0  1  2  3  4
0  NaN  1  1  X  4
1  NaN  2  2  Y  5 

0    object
1    object
2    object
3    object
4    object
dtype: object
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.