dtypes birinci eksene geçerken işleri emer (sütunlar)


9

Veri çerçevesini düşünün df

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

df

   A  B
0  1  X
1  2  Y

Eğer kaydırırsam axis=0(varsayılan)

df.shift()

     A    B
0  NaN  NaN
1  1.0    X

Beklendiği gibi tüm satırları bir satır aşağı iter.

Ama ben vardığımda axis=1

df.shift(axis=1)

    A    B
0 NaN  NaN
1 NaN  NaN

Beklediğimde her şey boş

     A  B
0  NaN  1
1  NaN  2

Bunun neden olduğunu anlıyorum. Çünkü axis=0, Pandalar her bir sütunun tek bir sütun olduğu sütuna göre işlemektedir dtypeve vites değiştirirken, NaNbaşlangıçta veya sonda girilen değerle nasıl başa çıkılacağı konusunda açık bir protokol vardır . Ancak birlikte axis=1ilerlerken dtypebir sütundan diğerine potansiyel belirsizliği getiriyoruz . Bu durumda, int64bir objectsütuna zorlamak için çalışıyorum ve Pandalar sadece değerleri sıfırlamaya karar veriyor.

Bu daha büyük sorunlara yol açar dtypesvardır int64vefloat64

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

df

   A    B
0  1  1.0
1  2  2.0

Ve aynı şey olur

df.shift(axis=1)

    A   B
0 NaN NaN
1 NaN NaN

Benim sorum

Ne iyi boyunca kaydırılır bir dataframe oluşturmak için seçenekler axis=1hangi sonuç kaymıştır değerler ve dtypes?

İçin int64/ float64durumda sonuç gibi görünecektir:

df_shifted

     A  B
0  NaN  1
1  NaN  2

ve

df_shifted.dtypes

A    object
B     int64
dtype: object

Daha kapsamlı bir örnek

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

Böyle görünmeli

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

Bana bir hata gibi görünüyor, tüm sütunların türlerini yaparsanız ne olur object?
— EdChum

İşe yarıyor. Zaten birkaç işim var. Sadece topluma bazı fikirler için bakıyorum.
— piRSquared

Ben bunu bir sorun olarak dosyalamak istiyorum, en azından gibi karışık bir dtype dtype tanıtımı için bir seçenek sunmalıdırobject
— EdChum

Bunu şimdi yapacağım.
— piRSquared

1
@ EdChum-ReinstateMonica Bir dakika! Vardiya>> gerçekleşir blocks. <Bunun yerine şunu kullanın ve bkz.df = pd.DataFrame(dict(A=[1, 2], B=[3., 4.], C=['X', 'Y'], D=[5., 6.], E=[7, 8], F=['W', 'Z']))
— piRSquared

Yanıtlar:


7

Pandaların benzer blokların üzerinden geçtiği ortaya çıkıyor dtypes

Define dfolarak

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

Tamsayıları bir sonraki tamsayı sütununa, kayanları bir sonraki kayan sütuna ve nesneleri bir sonraki nesne sütununa kaydırır.

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

Bunun iyi bir fikir olup bilmiyorum, ama bu olduğunu ne olup bittiğini.


Yaklaşımlar

astype(object) ilk

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

Yapacak 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

Muhtemelen bunu yapardım

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

4
Bu kesinlikle benim için bir hata, bu sütun anahtarlı olması ve sütun-bilge N pozisyonları ile kayma tüm noktasını geçersiz kılar
— EdChum

1
Toplantımdan sonra bir sorun yayınlayacağım.
— piRSquared

Tüm strdytpes varsa, o zaman doğru çalışır, bu df'de aynı şeyi yaparsanız, sütunu sütuna df = pd.DataFrame(dict(C=['X', 'Y'], D=[5., 6.], E=[7, 8], F=['W', 'Z']))kadar kaydırır , bu benim için kesinlikle yanlış, panda versiyonum, promosyon yapmalı ve sütunları böyle kaydırmamalı a way'XY''F'0.24.2dtype
— EdChum


1

Bir numpyyöntem kullanmayı denedim . Yöntem, verilerinizi sayısal bir dizide tuttuğunuz sürece çalışır:

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)

Ancak yapıcıyı çağırdığınızda , dizideki değerler şöyle olmasına rağmen DataFrametüm sütunlar dönüştürülür :objectfloat, 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.