dtypes अक्ष एक (कॉलम) पर शिफ्ट होने पर चीजों को टकराता है


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

जब मैं अपेक्षा करता हूं तो सब कुछ शून्य है

     A  B
0  NaN  1
1  NaN  2

मैं समझता हूं कि ऐसा क्यों हुआ। के लिए axis=0, पांडा स्तंभ से स्तंभ काम कर रहा है, जहां प्रत्येक स्तंभ एक भी है dtypeऔर जब स्थानांतरण, वहाँ कैसे शुरू की के साथ सौदा करने पर स्पष्ट प्रोटोकॉल है NaNशुरुआत या अंत में मूल्य। लेकिन जब axis=1हम साथ जाते हैं तो dtypeएक कॉलम से दूसरे कॉलम की संभावित अस्पष्टता का परिचय देते हैं । इस मामले में, मैं int64एक objectस्तंभ में बल के लिए कोशिश कर रहा हूं और पंडों ने मूल्यों को शून्य करने का फैसला किया है।

यह अधिक समस्याग्रस्त हो जाता है जब dtypesहोते हैं int64औरfloat64

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

मेरा प्रश्न

डेटाफ़्रेम बनाने के लिए अच्छे विकल्प क्या हैं axis=1जिनके साथ स्थानांतरित किया गया है , जिसके परिणामस्वरूप मूल्यों और dtypes स्थानांतरित हो गए हैं?

के लिए 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

मेरे लिए एक बग की तरह लग रहा है, अगर आप सभी स्तंभों के dtypes बनाते हैं तो क्या होगा object?
एडुकम

यह काम करता हैं। मैं पहले से ही काम के एक जोड़े के आसपास है। मैं सिर्फ कुछ विचारों के लिए समुदाय का मजाक उड़ा रहा हूं।
19 को piRSquared

मैं इसे एक मुद्दे के रूप में दर्ज करूंगा, उन्हें कम से कम मिश्रित प्रचार के लिए dtype प्रमोशन के लिए एक विकल्प प्रदान करना चाहिए जैसे किobject
EdChum

मैं अभी करूँगा।
6

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

यह पूर्णांक को अगले पूर्णांक कॉलम में ले जाएगा, फ़्लोट्स को अगले फ़्लोट कॉलम और ऑब्जेक्ट्स को अगले फ़ोरम कॉलम पर ले जाएगा

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
यह निश्चित रूप से मेरे लिए एक बग है, यह एन पोजिशन-कॉलम और शिफ्टिंग एन
पोजिशंस

1
मैं अपनी बैठक के बाद एक मुद्दा पोस्ट करूँगा।
16

यदि यह सभी strडायटस्प है, तो यह सही ढंग से काम करता है, यदि आप इस डीएफ पर भी ऐसा ही करते हैं तो df = pd.DataFrame(dict(C=['X', 'Y'], D=[5., 6.], E=[7, 8], F=['W', 'Z']))यह 'XY'कॉलम को सभी तरह से 'F'कॉलम में बदल देता है, यह निश्चित रूप से मेरे लिए गलत है, मेरा पांडा संस्करण है 0.24.2, यह dtypeप्रचार करता है और ऐसे कॉलम को शिफ्ट नहीं करता है एक रास्ता
EdChum


1

मैंने एक 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.