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.